获取所有迭代的捕获组

Dra*_*hin 5 c# regex

我正在研究 C# 正则表达式。

输入文本:

headera
aa1aaa
aa2aaa
aa3aaa

headerb
aa4aaa
aa5aaa
aa6aaa

headerc
aa7aaa
aa8aaa
aa9aaa
Run Code Online (Sandbox Code Playgroud)

我只想捕获headerbheaderc之间的数字 4、5 和 6

我的尝试:

我能够使用下面的模式捕获 headera 和 headerb 下的内容。我不能在后视上应用相同的概念,因为这应该是零宽度,因此不允许使用量词。

aa(\d+)aaa(?=[\s|\S]*headerc)
Run Code Online (Sandbox Code Playgroud)

重复捕获组将仅捕获最后一次迭代。我无法为多个实例应用一些通配符正则表达式。

请协助。谢谢

[已解决] 利用 .Net 能够支持可变宽度后视的优势。您可以使用以下模式:

@"(?<=headerb[\s|\S]*)aa(\d)aaa(?=[\s\S]*headerc)"
@"(?s)(?<=\bheaderb\b.*?)\d+(?=.*?\bheaderc\b)"
@"(?<=\bheaderb\b(?:(?!\bheaderc\b)[\s\S])*)aa(\d+)aaa"
Run Code Online (Sandbox Code Playgroud)

mik*_*kus 1

我真的建议简化问题,并在这种情况下仅在每行处理中使用正则表达式,首先预先选择正确的行。

无论如何,对于这个特定的例子来说,事情很简单:

headerb\n(aa(\d+)aaa\n)+\nheaderc
Run Code Online (Sandbox Code Playgroud)

应该管用。您可能需要调整空格/换行符。只需从 (\d+) 组中获取数字即可。PS,为了方便起见,您可以使用命名组,例如。 (?<number>\d+)将创建该number组。

更多信息请参见:https://msdn.microsoft.com/en-us/library/bs2twtah(v= vs.110).aspx