正则表达式 - 重复模式

时间:2013-03-20 15:40:38

标签: c# regex regular-language

我似乎无法得到它....我需要提取一个重复模式的文本字符串,但我只能得到它的一小部分,或者我得到整个字符串的单个匹配...

字符串是“标记”和“内容”的串联,我需要提取每个标记及其内容。

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个匹配标记,但没有内容,或一个匹配WHOLE输入字符串。

请指点:)

2 个答案:

答案 0 :(得分:1)

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

不会起作用,因为.+会消耗整行的其余部分(贪婪地匹配,没有什么能阻止它消耗其余部分)。

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

.+?只消耗一个字符,然后停止,因为它不情愿地匹配。

您需要能够指定“内容”何时结束。我真的不明白你提供的格式,以确保我知道正确的方法,但假设任意数量的大写字母后面跟冒号(如“T:”,“ST:”,或“ORANGUTANS:”)有资格作为标记,这应该有效:

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

使用negative lookahead识别下一个标记的开始位置。第一个和第二个捕获组应分别捕获标记和内容。

我对你用来命名捕获组的语法不太熟悉,但我相信这应该有用:

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

答案 1 :(得分:0)

试试这个:

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