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 个有标记但没有内容的匹配,要么得到一个与整个输入字符串匹配的匹配。

任何指针请:)

4

2 回答 2

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

行不通,因为.+会消耗整行的其余部分(它贪婪地匹配,并且没有什么可以阻止它消耗行的其余部分)。

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

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

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

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

它使用负前瞻来识别下一个标记的开始位置。第一和第二捕获组应该分别捕获标记和内容。

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

(?'marker'[A-Z]+:)(?'content'((?![A-Z]+:).)+)
于 2013-03-20T17:08:01.490 回答
0

尝试这个:

Regex("(T:|I:)").Split(s);
于 2013-03-20T19:48:48.203 回答