我想写一个正则表达式,可以匹配二进制字符串,其中连续的1必须有奇数长度。
例如: 1001110111被接受,10110111不被接受。
(1(11)*|0*)*我想出的最好的是上面的那个,这是不正确的。这个正则表达式也将匹配连续的偶数1。还有其他想法吗?
提亚
发布于 2019-10-22 01:57:35
您可以将此正则表达式用于此操作,并使用负先行:
^(?!(?:[01]*0)?(?:1{2})+(?:0|$))[01]+$RegEx详细信息:
当表达式中任意位置的1数为偶数时,
(?!(?:[01]*0)?(?:1{2})+(?:0|$)):表达式将导致匹配失败。(?:0|$)确保一对开头后面不跟1(?:[01]*0)?:仅允许在1s[01]+:之前出现0或1匹配长度为0或1的字符串和一个或多个长度的1发布于 2019-10-22 02:16:20
我认为另一种选择是只匹配0或匹配可选的前导零,然后重复匹配奇数1,后跟1+ 0或字符串末尾。
^(?:(?:0*1(?:11)*(?:0+|$))+|0+)$^开始string(?:非捕获组(?:非捕获组0*1(?:11)* 11(?:0+|$)匹配0+零,1并重复0+次数string匹配0+零或断言end of 1
- `)+` Close non capturing group and repeat 1+ times to not match empty strings
- `|` Or
- `0+` Match only zeroes
) Close non capturing group$ End of string(字符串关闭时不捕获字符串末尾)
发布于 2019-10-22 03:16:21
这应该不需要lookaround解决方案的复杂性。您尝试的解决方案的基本问题是0*可以在下一组0之前匹配零个1。
0*(1(11)*0+)*(1(11)*)?这将处理前导0。如果您不关心这一点,可以删除0*。
“肉”是0+的内在表达。由一个或多个1分隔的奇数组0。
因为这些组以0结尾,所以我们需要在末尾有一个可选的奇数组1,以防字符串以1结尾。
请注意,由于以上所有数量都是可选的,因此上面的解决方案也将匹配空字符串。如果您至少需要一个1,则会稍微复杂一些:
0*1(11)*(0+1(11)*)*0*https://stackoverflow.com/questions/58491724
复制相似问题