正则表达式匹配缺一场比赛?

我有正则表达式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。

 100001 0001 ^^^^^^ 

这是第一场比赛。 其余只是0001 ,与你的正则表达式不符。


如果使用lookaheads / lookbehinds,则可以绕过此行为:

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

实例


因为你不能在JavaScript中使用lookbehinds,所以只使用一个前瞻就足以防止重叠:

 1(0*)(?=1) 

实例


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

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

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

 (?=(YOUR_REGEX_HERE)) 

使用

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

请参阅正则表达式演示

在此处输入图像描述