正则表达式匹配偶数为1的字符串,并以0开头和结尾

时间:2019-01-12 10:52:50

标签: regex

我一直在尝试为上述语句创建一个正则表达式。到目前为止,我想出的最好的解决方案是0(0 *(10 * 10 *)* 0)?。这样可以匹配一个零和多个​​零,我相信这是正确的,但我只是想知道是否有一个更简单的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用效率更高的模式,例如

^0+((0*10*1)*0+)?$

具有非捕获组:

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

如果需要允许使用空字符串:

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

请参见regex demo。由于零在重复组中位于零之前,因此在匹配最后一个零时回溯要少一些。

详细信息

  • ^-字符串的开头
  • 0+-一个或多个0
  • ((0*10*1)*0+)?-的可选序列
    • (0*10*1)*-0+个重复,分别是0+个零,1,0+个零,然后又是1
    • 0+-一个或多个0
  • $-字符串的结尾。

答案 1 :(得分:1)

尝试以下正则表达式:

^0(?=(?:(?:[^1]*1){2})+[^1]*0$).*

详细信息:

  • ^0-字符串的开头和(前导)0
  • (?=-积极展望:
  • (?:-一个非捕获组(外部)。
    • (?:-另一个(内部)非捕获组,containig:
    • [^1]*1-除11以外的其他字符序列(可能为空)。
    • ){2}-发生2次(一对)。
  • )+-该组(一对)可以出现几次(偶数个)。
  • [^1]*-除1之外的其他字符序列(可能为空)
  • 0$-0和字符串的结尾(以0结尾)。
  • )-正向超前结束。
  • .*-匹配整个字符串。

如果您接受不存在1个字符,则在外部捕获后更改+ 分组到*

有关工作示例,请参见https://regex101.com/r/FvP0Ud/1

您可以尝试使用此正则表达式,在开始时添加/删除1个字符 /结束/在字符串中间,观察字符串是否匹配 是否。

另一个详细信息:上述正则表达式还允许使用01以外的数字 通常是所有字符。如果要限制允许的字符为 只需01,将[^1]更改为0(在两个地方)。