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

时间:2017-02-01 20:23:25

标签: c# regex

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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

这意味着您应该使用捕获组(( + 您的模式 + ))包裹您的模式,并将此消费模式置于正向前方,然后匹配所有发生并抓住第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

enter image description here

答案 1 :(得分:2)

您已经在第一场比赛中选择了第二个零前面的1。

100001 0001
^^^^^^

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

如果您使用的是lookaheads / lookbehinds,则可以规避此行为:

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

Live example

因为您无法在JavaScript中使用lookbehinds,所以仅使用一个前瞻就足以防止重叠:

1(0*)(?=1)

Live example

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