在 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# 中获取重叠的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章