我想出了一个正则表达式(0|10)*
来执行某项任务。我的朋友不相信这会识别字符串0*100*
。 (请不要给我一个正则表达式来识别这个字符串。我知道如何自己做,但我想出的正则表达式除了识别这个字符串之外还要解决其他一些问题)。有多少人认为它能识别字符串0*100*
?我希望如此。为了说服自己,我尝试将模式与grep
匹配,并且确实与之匹配。例如,以下命令匹配echo中的模式,这意味着我的正则表达式是正确的。不是吗?
echo 00000000000000100000000000 | grep '\(0\|10\)*'
答案 0 :(得分:2)
绝对匹配。你基本上是在说
匹配一个字符串,其中我有0或10重复任意数量的字符串 次
现在取0 * 100 *并将其分组:
编辑:我们也尝试一下正式的证据:
(0 | 10)* - >相应的语法:
A -> 0|10|e
B -> BA|AB
等效形式:
A -> 0|10|e|0A|10A|A0|A10
0 * 100 * - >相应的语法:
A -> 0|0A|A0|e
B -> 10
C -> ABA
等效形式:
A -> 10|0A|A0
我们可以看到第二个语法的产生是第一个语法产生的一个子集,因此第一个语法应该匹配第二个语法产生的任何表达式。
答案 1 :(得分:0)
是的,它在我看来是认可的。 1是不可能的,01也是不可能的。你的模式无法完成所有这一切。
答案 2 :(得分:0)
请注意,您的表达式与整个模式不匹配。它匹配模式中间的“10”。尝试echo 00000000000000100000000000 | grep --color=always '(0\|10)*'
看看你匹配的表达式的哪个部分。如果您使用^(0\|10)*$
强制匹配整个字符串,则不匹配。我不确定你是否试图匹配整个字符串。如果您使用扩展正则表达式(egrep或grep -E),它将匹配整个字符串。因此,您正在谈论的正则表达式究竟是什么样的。