2013-03-20 140 views
1

我只是似乎無法得到它....我有一串文字,我需要從中提取重複模式,但我只能得到它的一小部分,或者我得到一個單一的整個字符串的匹配...正則表達式 - 重複模式

字符串是「標記」加上「內容」的連接,我需要提取每個標記及其內容。

string s = "T:  2 YE    I:  4 YE"; 
Match m = Regex.Match(s, "(?'marker'(T|I)):(?'content'.+)"); 
while (m.Success) 
{ 
    string Marker = m.Groups["marker"].value; // (T: or I:) 
    string Content = m.Groups["content"].value; // (2 YE or 4 YE) 
    m = m.NextMatch(); 
} 

我試過「。+」和「。+?」最大/最小捕捉,但我要麼獲得2個匹配有標記但沒有內容,或者一個匹配整個輸入字符串。

任何指針請:)

+0

可以T或我是部分的內容? – 2013-03-20 15:44:59

+0

Opps ...忘了「nextmatch()」 – 2013-03-20 15:46:39

+0

他們永遠不會在內容中...但是,我不介意他們被提取爲「內容」匹配組的一部分(而不是標記組( – 2013-03-20 15:47:52

回答

1
(?'marker'(T|I)):(?'content'.+) 

不會起作用,因爲.+會消耗行的全部剩餘部分(它的比賽貪婪,並沒有什麼阻止它消耗行的其餘部分)。

(?'marker'(T|I)):(?'content'.+?) 

.+?只會消耗一個字符,然後停下來,因爲它不情願地匹配。

您需要能夠指定何時「內容」結束。我真的不明白你提供的格式足夠好,以確保我知道這樣做的正確方法,但假設任何數字的大寫字母后跟一個冒號(如「T:」,「ST:」,或「猩猩」)資格作爲一個標誌,這應該工作:

([A-Z]+:)(((?![A-Z]+:).)+) 

它採用了negative lookahead識別下一個標記開始的地方。第一和第二捕獲組分別應該捕獲標記和內容。

我不太熟悉你使用命名捕獲組語法,但我相信這應該工作:

​​
+0

令人敬畏的正則表達式和很好的解釋 - 負面的超前總是仍然抓住我!! +1 !! – 2013-03-20 20:25:22

+0

只是機票....謝謝! – 2013-03-21 09:16:24

0

試試這個:

Regex("(T:|I:)").Split(s);