2013-03-20 99 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);