正则表达式在可能进行正面回溯后(自动换行后)后进行多个匹配
本文关键字:自动换行 回溯 正则表达式 | 更新日期: 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 解决方案比正则表达式更具可读性。