我有正则表达式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
我做错了什么?
答案 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
答案 1 :(得分:2)
您已经在第一场比赛中选择了第二个零前面的1。
100001 0001
^^^^^^
这是第一场比赛。其余的只是0001
,与你的正则表达式不匹配。
如果您使用的是lookaheads / lookbehinds,则可以规避此行为:
(?<=1)(0*)(?=1)
因为您无法在JavaScript中使用lookbehinds,所以仅使用一个前瞻就足以防止重叠:
1(0*)(?=1)
以及regex101
示例的提示:您没有添加全局标记,这会阻止多个选择。