2011-10-01 63 views
3

我想使用C#在任意輸入中提取兩個冒號(,包括冒號的)之間的任何內容。鑑於從輸入中提取組的C#正則表達式

String input = "a:one:b:two:c:three:d"; 

我想

{string[3]} 
[0]: ":one:" 
[1]: ":two:" 
[2]: ":three:" 

使用

String[ ] inverse = Regex.Split(input, ":.*?:"); 

我得到我想要的正好相反......

{string[4]} 
[0]: "a" 
[1]: "b" 
[2]: "c" 
[3]: "d" 

我怎麼能逆此或爲有一些比Regex.Split更合適的情況?

回答

1

:[^:]+: 1.匹配冒號 2.緊隨任何非冒號字符一次或多次。 3.緊接着冒號。

爲了得到一套比賽用MatchCollection matches = Regex.Matches(blah, ":[^:]+:");代替Regex.Split

正則表達式的簡潔和強大,但我發現自己書面方式,正如許多評論的,使用的時候我會編碼。

+0

這返回與他第一次嘗試時相同的結果。 – Bernesto

+0

比賽集合是正確的設置....我測試之前,我張貼。 –

+0

+1 @Matthew ..你可以看到我得出了同樣的結論(使用匹配)在我接受評論克里斯(另一個克里斯)上面..只是一個稍微不同的模式..我與你在正則表達式的優點/缺點..當我寫代碼行,我知道可以用正則表達式替代它驅使我堅果,但如果我決定使用正則表達式來代替那些過程往往導致我堅果的代碼行。 – Chris

0

您如何使用常規拆分(在':'),提取每個第二個元素,然後將冒號重新添加回來?我覺得你太過於複雜了。

+0

TBH這種方式比我現在要了解它的方式更加複雜。我想在一個操作中進行拆分+分組的次數並不多 – Chris

+0

您所做的並不是分裂,因爲拆分完全按照它的說法進行。它從中間切下。你說的是匹配,現在爲時已晚,我想爲這種模式提出一個優雅的正則表達式。 –

+0

哈哈接受的基礎上,你的權利,兩個計數.. 1.我需要一個不匹配的比賽... MatchCollection匹配= Regex.Matches(輸入,「:。*?:」);將會做到這一點,並且2,對於SO編碼和|或者問Qs太晚了。謝謝你提醒我。 – Chris

0

試試這個正則表達式:

^(\w*):|:\w:|:\w$ 
+0

嗨bernesto ..我假設你的意思是與分裂,而不是匹配使用該正則表達式..我嘗試了兩種方式,既沒有工作,或者我沒有使用它,因爲你打算..無論哪種方式,我會堅持原來的答案,但謝謝張貼。 – Chris

+0

這是一個分裂。經過測試和工作。謝謝你的評論。 – Bernesto