为什么正则表达式^([0 | 1] 1)+ $匹配字符串“111”?

时间:2014-09-20 16:17:00

标签: regex

我正在尝试编写一个正则表达式来匹配二进制字符串,其中每个奇数字符都是1

我想出了这个:

^([0|1]1)+$

我的逻辑:

^匹配行的开头

(启动了一个捕获组

[0|1]匹配01(因为第0位是偶数)

1上一个字符(01)后面必须跟1

+重复上一个模式一次或多次

$匹配行尾

所以根据我的逻辑,上面的正则表达式应该匹配二进制字符串,其中每个其他字符(第一个“其他”字符是字符串中的第二个字符)是1

但是,它无法正常工作。例如,字符串111不匹配。

为什么它不起作用,我应该改变什么来使它工作?

Regex101 Test

4 个答案:

答案 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

的大小写