在 C# 中获取重叠的正则表达式匹配

Posted

技术标签:

【中文标题】在 C# 中获取重叠的正则表达式匹配【英文标题】:Getting overlapping regex matches in C# 【发布时间】:2019-07-27 02:23:32 【问题描述】:

我有正则表达式 1(0*)1 和测试字符串 1000010001

我想要 2 个匹配项,但我发现只找到 1 个:

var regex = new Regex("1(0*)1");
var values = regex.Matches(intBinaryString);
// values only has 1 match

regexonline 似乎同意:https://regex101.com/r/3J9Qxj/1

我做错了什么?

【问题讨论】:

【参考方案1】:

您已经在第一个匹配项之前选择了第二个零前面的 1。

100001 0001
^^^^^^

这是第一场比赛。其余的只是0001,它与您的正则表达式不匹配。


如果您使用前瞻/后视,则可以规避此行为:

(?<=1)(0*)(?=1)

Live example


因为你不能在 javascript 中使用lookbehinds,所以只使用一个lookahead就足够了,以防止重叠:

1(0*)(?=1)

Live example


还有一个提示您的 regex101 示例:您没有添加全局标志,这会阻止多个选择。

【讨论】:

【参考方案2】:

你需要匹配重叠的字符串。

这意味着你应该用一个捕获组(( + 你的模式 + ))包装你的模式,并将这个消耗模式放入一个积极的前瞻中,然后匹配所有出现并获取组1 个值:

(?=(YOUR_REGEX_HERE))

使用

var regex = new Regex("(?=(10*1))");
var values = regex.Matches(intBinaryString)
    .Cast<Match>()
    .Select(m => m.Groups[1].Value)
    .ToList();

见regex demo

【讨论】:

以上是关于在 C# 中获取重叠的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中的重叠匹配

正则表达式获取 C# 中模式的所有可能匹配项

如何检测两个正则表达式在它们可以匹配的字符串中是不是重叠?

求一条c# 正则表达式,来获取HTML标签的内容

C# 正则表达式匹配具有分隔符的字符串

替换字符串中的重叠匹配项(正则表达式或字符串操作)