正则表达式在可能进行正面回溯后(自动换行后)后进行多个匹配

本文关键字:自动换行 回溯 正则表达式 | 更新日期: 2023-09-27 18:33:36

我是正则表达式的新手,并且有以下问题:

正在解析的文本文件:

KeywordA:   123
    93  0   0   524 0   0   78  0   0   6789    0   0
KeywordB:   456
    93  0   0   524 0   0   78  0   0   6789    0   0
KeywordC:   789
    93  0   0   524 0   0   78  0   0   6789    0   0

现在我想在"关键字B:456"之后的下一行中获取所有具有 2 位或更多数字的数字。

我尝试了表达/(?<=KeywordB:'t456'n't)('d{2,})/g

但是有了那个,我只得到第一个数字(而且只是因为 93 是一个多位数字的数字)。

甚至是否有可能与 RegEx 获得所有适当的匹配项,您希望在一个模式之后与一个模式进行多个匹配并进行自动换行,或者我错过了一些基本的东西?

正则表达式在可能进行正面回溯后(自动换行后)后进行多个匹配

您可以使用

'G锚点在上一个匹配结束时继续匹配:

KeywordB:'t456'n|'G't(?:('d{2,})|'d)

.NET 小提琴示例在这里

您还可以删除正回溯,因为您只是检索第一个捕获组中的值。

解释:

  • KeywordB:'t456'n|'G - 比赛KeywordB:'t456'n或上一场比赛的开始('G)。
  • 't - 在KeywordB:'t456'n或上一个匹配结束后匹配选项卡,'t
  • (?: - 非捕获组的开始。
  • ('d{2,})|'d - 捕获两个或多个数字的组或匹配单个数字
  • (换句话说,如果未捕获两个多个数字,请匹配单个数字并继续)。
  • ) - 非捕获组的结束。

基于您提供的数据的输出:

93
524
78
6789

上面示例中使用的代码片段:

string pattern = @"KeywordB:'t456'n|'G't(?:('d{2,})|'d+)";
string input = @"KeywordA:  123
    93  0   0   524 0   0   78  0   0   6789    0   0
KeywordB:   456
    93  0   0   524 0   0   78  0   0   6789    0   0
KeywordC:   789
    93  0   0   524 0   0   78  0   0   6789    0   0";
foreach (Match match in Regex.Matches(input, pattern))
{
    string groupOne = match.Groups[1].Value;
    if (!string.IsNullOrEmpty(groupOne))
    {
        Console.WriteLine(groupOne);
    }
}

使用 .net,您可以使用可变长度的查找:

(?<=^KeywordB:'s*456'r?'n.*)'b'd{2,}

(带多行选项)

演示

我想

我会把它作为替代方案,所以我知道这不是这个问题的直接答案。但是你能用 LINQ 吗?

File
    .ReadAllLines("file.txt")
    .SkipWhile(line => line != "KeywordB:   456")
    .Skip(1)
    .Take(1)
    .SelectMany(line => line.Split(' ', ''t'))
    .Where(part => part.Length >= 2)
    .ToArray();

通过您的输入,我得到:

票价:93、524、78、6789 元

我几乎总是发现 LINQ 解决方案比正则表达式更具可读性。