我一直在尝试为上述语句创建一个正则表达式。到目前为止,我想出的最好的解决方案是0(0 *(10 * 10 *)* 0)?。这样可以匹配一个零和多个零,我相信这是正确的,但我只是想知道是否有一个更简单的解决方案。
答案 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
-除1
和1
以外的其他字符序列(可能为空)。){2}
-发生2次(一对)。)+
-该组(一对)可以出现几次(偶数个)。[^1]*
-除1
之外的其他字符序列(可能为空)0$
-0
和字符串的结尾(以0结尾)。)
-正向超前结束。.*
-匹配整个字符串。如果您接受不存在1
个字符,则在外部捕获后更改+
分组到*
。
有关工作示例,请参见https://regex101.com/r/FvP0Ud/1
您可以尝试使用此正则表达式,在开始时添加/删除1
个字符
/结束/在字符串中间,观察字符串是否匹配
是否。
另一个详细信息:上述正则表达式还允许使用0
和1
以外的数字
通常是所有字符。如果要限制允许的字符为
只需0
和1
,将[^1]
更改为0
(在两个地方)。