我似乎无法得到它....我需要提取一个重复模式的文本字符串,但我只能得到它的一小部分,或者我得到整个字符串的单个匹配...
字符串是“标记”和“内容”的串联,我需要提取每个标记及其内容。
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输入字符串。
请指点:)
答案 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);