2011-10-27 33 views
1

我有一種情況..
有一個字符串可以包含數字,字母和一些符號,我想從中提取或做一些替換基於一些「規則」。 我的東西最好是給我想要做的(顯示)什麼可能的情況的一些例子:通過規則使用正則表達式的C#字符串操作

String   Display1 or Display2 

AB_X345   X345   or ###X345 
AB_1234   1234  or ###1234 
X987_TEXT_4567 X9874567  or X987######4567 
X987TEXT4567  X9874567  or X987####4567 
X798TEXT   X798   or X798#### 
789TEXT   789   or 789#### 
X400    X400   or X400 

所以實際上當我找到一個X,然後我想顯示他們的數字。如果出現一些文字,我不希望它顯示,或者我希望它用一個字符(#)掩蓋。 如果不存在X,我只想顯示數字。 Regex是這樣做的最簡單的方法嗎? (我對正則表達式不熟悉 - 只是對它有一個鳥瞰圖)。 是否所有規則都可以在單個正則表達式中進行收集或複雜化?

謝謝你的任何sugestions

+0

哪裏之前,從'1234'和'789'的空間? – xanatos

+0

'1234_X567'呢? – xanatos

+0

該空間沒有semnification :)對不起..我只是希望看到更好,沒有X.關於你指出的情況下,這將不會出現.. :) – movi

回答

2

很簡單:

resultString = Regex.Replace(subjectString, 
    @"\D  # Match a non-digit character 
    (?<!  # unless... 
    X   # it's an X 
    (?=\d) # which is followed by a digit. 
    )   # End of lookbehind", 
    "", RegexOptions.IgnorePatternWhitespace); 

更改最後一行

"#", RegexOptions.IgnorePatternWhitespace); 

#掩蓋字符刪除它們來代替。

+0

驚人的多麼容易你解決這個問題! (+1) – stema

+0

考慮到他的例子(使用TEXT這個詞),我會說'LEX12340' =>'1234'而不是'X1234'。你用這個正則表達式捕捉非歐洲數字。 – xanatos

+0

@stema很簡單,決定一個正則表達式是對還是錯,比寫它更困難。 :-) – xanatos

1

嘗試此顯示器1:@"(?<![A-Za-z])X[0-9]+|[0-9]+"

var rx = new Regex(@"(?<![A-Za-z])X[0-9]+|[0-9]+"); 
var matches = rx.Matches("X987_TEXT_4567"); 

var result = ""; 

foreach (Match match in matches) 
{ 
    result += match.Value; 
} 

在C#4.0,你甚至可以做

var rx = new Regex(@"(?<![A-Za-z])(?<1>X[0-9]+)?(?:(?:[^0-9]*)(?<1>[0-9]+))*"); 
var match = rx.Match("X987_TEXT_4567_123"); 
var res = string.Concat(match.Groups[1].Captures.OfType<Capture>().Select(p => p.Value)); 

但在這一點上,正則表達式變得有點不可讀:-)

+0

@stema更改爲零寬度負向lookbehind – xanatos

+0

尼斯解決方案也;)並感謝您給C#4.0的版本也,但我只有3.5 :) – movi

1

試試這個正則表達式:

X\d|\d

OR

/X\d|\d/g

這將只選擇數字或數字開頭'X'

0

試試這個,檢查下面的例子並測試它。

\d?X[0-9]+|[0-9] 

例子:
http://rubular.com/r/cA5Y49pCtV

+0

您在此給出的鏈接非常方便:)謝謝!我發現alos一些正則表達式檢查工具,但這是最簡單的:) – movi

+0

沒問題,很高興我可以幫你。 –

相關問題