2010-09-15 66 views
2

我目前正在解析SQL Server的一些數據,我需要正則表達式的幫助。

我在Sql Server 2005中有一個程序集,可以幫助我用C#替換字符串。Regex.Replace()方法。

我需要解析以下內容。

Strings: 

    CAD 90890 

    (CAD 90892) 

    CAD G67859 

    CAD 34G56 

    CAD 3S56. 

    AX CAD 890990 

    CAD 783783 MX 

    Needed Results: 

    90890 

    90892 

    G67859 

    34G56 

    3S56 

    890990 

    783783 

SELECT TOP 25 CADCODE, dbo.RegExReplace(CADCODE, '*pattern*', '$1') 
FROM dbo.CADCODES 
WHERE CADCODE LIKE '%CAD%' 

我需要獲得CAD單詞後面的程序串,直到遇到一個空格或任何非數字或數字。我設法弄到了數字,但是對其他人來說確實失敗了。我試圖讓它工作,但我找不到真正的解決方案。

在此先感謝。

更新,以反映新的字符串

AX CAD 890990

CAD 783783 MX

回答

1

試試這個:

(\w+)\W*$ 

模式的最後一個字匹配 - 由字母數字的(和下劃線)。
例子:http://www.rubular.com/r/1zWQQVLZy1

另一種選擇是找一個字至少有一個數字 - 這一個可以在任何地方匹配字符串,所以你可能需要處理多個匹配。在這種情況下,您可以在整個模式中添加捕獲組,或使用$&替換。

[a-zA-Z_]*\d\w* 

例子:http://www.rubular.com/r/XUrFNuPQUv

如果無法比擬的(Regex.Match),並且必須使用Regex.Replace,可以匹配整個字符串開始到結束,並與您需要的組替換:

RegExReplace(CADCODE, '^.*\b([a-zA-Z_]*\d\w*)\b.*$', '$1') 
+0

如果某些字符串不是以CAD開頭,而是後跟字母數字字符,會發生什麼? – 2010-09-15 19:58:56

+0

@Callum Rogers - 無論如何我都捕獲它們,但問題並沒有定義這個位是否重要。我可能會問你一樣 - 如果OP想要在任何情況下捕獲該怎麼辦? – Kobi 2010-09-15 20:00:54

+0

[a-zA-Z _] * \ d \ w *完全匹配我需要了解的是如何獲得替換的輸出$ 1,因爲我需要完全消除CAD。 – 2010-09-15 20:03:42

0

試試這個:

(?:\(CAD\)|CAD)\s+?([\dA-Z]+) 

您CA n從捕獲組編號1得到結果。

0

正則表達式的問題在於,如果您有一個有限的樣本集,那麼獲得一個好的模式總是很容易的。

在你的情況,你可以使用: \ w {4} \ W *

這只是說,4個字母數字,其次是0個或多個字母數字,因此,所有的CAD部分將不匹配,也不會空間要麼 ()。

+0

正則表達式的問題在於它在對接中是一種痛苦。無論如何CAD可以有多個數字甚至一個單詞,但我真正需要的是CAD之後的WORD,直到它以不是字母數字或字母[A-Za-z]的任何字母結尾。只需提取它並將其作爲$ 1的輸出。 – 2010-09-15 20:09:16

+0

所以如果我正確地理解你,你會有CAD,然後是一些東西,然後是一個或多個空格,然後你想要那個單詞?如何:CAD \ W * \ S +(\ W +) – LoveMeSomeCode 2010-09-15 20:25:03

+0

請參閱@Alan Moore的方法它的工作原理與我匹配單詞的方式類似,但無法獲得輸出組。但是,正如他所建議的,你需要首先匹配整個字符串。 – 2010-09-15 20:27:17

1

我覺得這是你追求的:

^\W*\w*CAD\w*\W*(\w+)\W*$ 

正則表達式有整個字符串匹配,從而REGEXREPLACE可以$1更換,有效地剝離不需要的部分。

編輯:讓我備份,並確保我有這個權利。由於

WHERE CADCODE LIKE '%CAD%' 
在查詢

的,你已經知道每一個字符串包含序列CAD。既然如此,就不需要通過再次匹配該序列來使正則表達式複雜化。這應該是你所需要的全部:

^.*?(\w+)\W*$ 
+0

偉大的方法和它的工作我只是有一個輕微的問題,不在範圍內。我發現我將以「AX CAD 098909」而不是CAD作爲開頭的字符串,並在「CAD 098909 MX」之後串起。 – 2010-09-15 20:30:14