正则表达式最多可包含一个infix 00和一个infix 11

时间:2019-05-06 20:31:10

标签: regex

我有一个位序列,也可以从0开始。我想写一个只匹配序列的正则表达式,它包含00 <=一次和11 <=一次。

我的尝试是^([01](?!(?:[^(00|11)]*(00|11){2})))*$,我尝试了regex101.com。遗憾的是,这实际上并不起作用。

例如,它与010000(正确)不匹配,但与01000100匹配,显然不应该被检测到。

2 个答案:

答案 0 :(得分:2)

在您的模式中,该部分[^(00|11)]使用否定的字符类,该字符类将与所列字符以外的任何字符匹配,并且可以写为[^01|)(]

一种选择是使用2个负前瞻性断言00和11的出现不超过2次,用1个正前瞻性断言存在11个。

^(?!(?:[01]*11){2})(?!(?:[01]*00){2})(?=[01]*11)[01]*00[01]*$

说明

  • ^字符串的开头
  • (?!(?:[01]*11){2})负向前进,断言右边不是2乘以11
  • (?!(?:[01]*00){2})负向前进,断言右边的值不是00的2倍。
  • (?=[01]*11)前瞻,断言11
  • [01]*00[01]*匹配0+次0或1,然后匹配00,然后是0+次0或1
  • $字符串结尾

Regex demo

答案 1 :(得分:0)

您可以将其视为密码验证

access_token: 'xxxxx' scope: '' token_type: 'bearer'

https://regex101.com/r/nIDjNq/1

解释

^(?!.*00.*00)(?!.*11.*11)(?=.*00)(?=.*11)[01]+$

基准 fwow

 ^                     # BOS
 (?! .* 00 .* 00 )     # Not 2 of  '00'
 (?! .* 11 .* 11 )     # Not 2 of  '11'
 (?= .* 00 )           # Has a '00'
 (?= .* 11 )           # Has a '11'
 [01]+                 # Match multiple  0 or 1
 $                     # EOS