我正在尝试编写一个正则表达式来匹配二进制字符串,其中每个奇数字符都是1
。
我想出了这个:
^([0|1]1)+$
我的逻辑:
^
匹配行的开头
(
启动了一个捕获组
[0|1]
匹配0
或1
(因为第0位是偶数)
1
上一个字符(0
或1
)后面必须跟1
+
重复上一个模式一次或多次
$
匹配行尾
所以根据我的逻辑,上面的正则表达式应该匹配二进制字符串,其中每个其他字符(第一个“其他”字符是字符串中的第二个字符)是1
。
但是,它无法正常工作。例如,字符串111
不匹配。
为什么它不起作用,我应该改变什么来使它工作?
答案 0 :(得分:4)
如果你需要每个奇怪的角色都是1
,那么你需要更像这样的东西:
^([01]1)*[01]?$
第一个字符可以是任何字符,下一个字符可以是1
,然后重复几次,而最后一个字符可以是0或1。
不需要角色类中的管道,实际上正在使你的正则表达式也匹配管道角色。所以完全删除它。您可以在组中使用管道(例如(?: ... )
或( ... )
来表示替换)。
以上内容也会匹配一个空字符串,因此您可以在开头添加(?=.)
以强制匹配至少1个字符(即^(?=.)([01]1)*[01]?$
。
上述内容将匹配您所在的位置(x
为0或1):
x
x1
x1x
x1x1
x1x1x
x1x1x1
等
另一方面,您当前的正则表达式试图匹配偶数个字符。您重复完全匹配2个字符的组([0|1]1)
(不多也不少),因此整个匹配的长度将是2的倍数。
在末尾添加可选的[01]
允许匹配奇数个字符串的字符串。
答案 1 :(得分:2)
您的正则表达式仅适用于偶数长度的字符串。 [01]
和1
每个匹配一个字符,因此您的捕获组匹配2个字符。
这会修改你的正则表达式以接受奇数长度的字符串:
^([01](1|$))+$
答案 2 :(得分:1)
首先,[0|1]
应为[01]
。否则,您有一个匹配的字符组,0
,|
或1
。
现在,[01]1
恰好匹配两个字符。因此([01]1)+
不能匹配长度不是2的倍数的字符串。
要使其与奇数长度的输入一起使用,请将正则表达式更改为
^(([01]1)+[01]?|1)$
答案 3 :(得分:0)
您可以使用此模式:
^1?([01]1)+$|^1$
或
^(1?([01]1)+|1)$
要处理奇数或偶数位数,您需要在开头设置一个可选的1?
。为了确保至少有一个数字,您不能为该组使用*
量词,否则该模式可以匹配空字符串。这就是为什么,您需要对组使用+
并添加单个1