2014-09-19 16 views
0

相同的字符我有一個​​字符串:正則表達式斯普利特 - 逃避我使用的分裂

string data = "SEQUENCE $FIRST$ THEN $SECOND$ AND FINALLY \\$12345"; 

我想用正則表達式用「$」字符就分手了。但是,我想使用\作爲轉義字符。

string[] sComponents = Regex.Split(data, "(\\$)", RegexOptions.ExplicitCapture); 

通過運行上面的代碼,我會得到:

sComponents[0] = "SEQUENCE " 
sComponents[1] = "FIRST" 
sComponents[2] = " THEN " 
sComponents[3] = "SECOND" 
sComponents[4] = " AND FINALLY " 
sComponents[5] = "12345" 

但我想sComponents [4]包含$,如 「最後$ 12345」

什麼是最好的方式爲了達到這個目的,Regex在分裂時有一些類型的轉義字符嗎?或者在我用我自己的邏輯調用Regex Split之前,我必須手動處理這個問題?

基本上歸結爲,如果正則表達式看到「$」然後分裂,但如果它看到「\\ $」,那麼忽略它不會在這個位置分裂。

+0

什麼是防止從分裂中的 '12345' 前的 '$' 出現的規則?事實是它在一個數字的前面,或者最後沒有對應的'$'? – md4 2014-09-19 17:20:45

+0

我正在考慮使用\\,例如「SEQUENCE $ FIRST $ THEN $ SECOND $ AND FINALLY \\ $ 12345」 – Fylix 2014-09-19 17:22:39

+0

@Fylix,你真的想要一個字符串數組,還是你想要替換像$ FIRST $和$ SECOND $與其他值,所以你最終得到一個字符串,用其他值替換這些東西? – aquinas 2014-09-19 17:46:12

回答

4

只是根據下面的正則表達式分割輸入的字符串,它使用負向前視。

\$(?!\d) 

代碼:

string value = "SEQUENCE $FIRST$ THEN $SECOND$ AND FINALLY $12345"; 
string[] lines = Regex.Split(value, @"\$(?!\d)"); 
foreach (string line in lines) { 
Console.WriteLine(line); 

IDEONE

更新:

使用以下正則表達式根據$符號未用兩個反斜線preceeded分裂輸入。

(?<!\\\\)\$ 

代碼:

string value = "SEQUENCE $FIRST$ THEN $SECOND$ AND FINALLY \\\\$12345"; 
string[] lines = Regex.Split(value, @"(?<!\\\\)\$"); 
foreach (string line in lines) { 
Console.WriteLine(line); 

IDEONE