Regex 匹配0和1的正则表达式,其中连续1必须为奇数?

Regex 匹配0和1的正则表达式,其中连续1必须为奇数?,regex,Regex,我想写一个正则表达式,可以匹配二进制字符串,其中连续的1必须有奇数长度 示例:接受1001110111,不接受10110111 (1(11)*|0*)* 我想到的最好的是上面的那一个,这是不正确的。这个正则表达式也将匹配连续的偶数1。还有其他想法吗 TIA您可以使用此正则表达式进行负前瞻: ^(?!(?:[01]*0)?(?:1{2})+(?:0|$))[01]+$ 正则表达式详细信息: (?!(?:[01]*0)?(?:1{2})+(?:0 |$):当表达式中任意位置有偶数个1s时,表

我想写一个正则表达式,可以匹配二进制字符串,其中连续的1必须有奇数长度

示例:接受1001110111,不接受10110111

(1(11)*|0*)*
我想到的最好的是上面的那一个,这是不正确的。这个正则表达式也将匹配连续的偶数1。还有其他想法吗


TIA

您可以使用此正则表达式进行负前瞻:

^(?!(?:[01]*0)?(?:1{2})+(?:0|$))[01]+$

正则表达式详细信息:

  • (?!(?:[01]*0)?(?:1{2})+(?:0 |$)
    :当表达式中任意位置有偶数个
    1
    s时,表达式匹配失败
    (?:1{2})+
    匹配一对
    1
    s
  • (?:0 |$)
    确保一对
    1
    s后面不跟
    1
  • (?:[01]*0)?
    :仅允许出现
    0
    或在
    1
    s之前启动

  • [01]+
    :将0或1的字符串与一个或多个长度匹配


我认为另一种选择可能是只匹配零或匹配可选的前导零,然后重复匹配奇数1,后跟1+零或字符串末尾

^(?:(?:0*1(?:11)*(?:0+|$))+|0+)$
  • ^
    字符串的开头
  • (?:
    非捕获组
    • (?:
      非捕获组
      • 0*1(?:11)*
        匹配0+零,
        1
        并重复0+次
        11
      • (?:0+|$)
        匹配1+零或断言字符串结尾
    • )+
      关闭非捕获组并重复1+次以不匹配空字符串
    • |
    • 0+
      仅匹配零
  • 关闭非捕获组
  • $
    字符串结尾

这不需要环视解决方案的复杂性。您尝试的解决方案的基本问题是
0*
,它可以在下一组
1
s之前匹配零
0
s

0*(1(11)*0+)*(1(11)*)?
这将处理前导
0
s。如果您不担心,可以删除
0*

“meat”是带有
0+
的内部表达式。由一个或多个
0
s分隔的
1
s奇数组

由于这些组以
0
结尾,因此如果字符串以
1
结尾,我们需要在末尾添加一个可选的
1
s奇数组

请注意,由于上述所有数量都是可选的,因此上述解决方案也将匹配空字符串。如果您至少需要一个
1
,它会稍微复杂一些:

0*1(11)*(0+1(11)*)*0*

如果您的正则表达式支持防止回溯

^0*(?:(?:11)*+10*)*$

请注意,这一个也将匹配一个空字符串。
如果字符串始终以
1
开头并包含一个或多个字符,请尝试
^(?。*(?)或
^(?。*(?:0 |^)(?:1{2})+(?:0 |$)[01]*$
它将连续匹配,因为没有边界或锚点。当它无法从第一个位置匹配时,它将从下一个位置开始。您使用的是什么语言?为什么要使用正则表达式?