regex 一般表示式:至少包含两个0,但不是连续的0

xnifntxz  于 2022-12-14  发布在  其他
关注(0)|答案(8)|浏览(201)

这个练习的解是下面的正则表达式吗?我在网上找到的,但我不相信这是正确的。

(1*011*(0+011*))*

根据《计算语言学与自然语言处理手册》一书中第一章的理论,我该如何解决这个练习呢?
我想要一个正则表达式,将满足下面的正则语言

L = {010,0101,0110,0101010,01011110,.....}
iq3niunx

iq3niunx1#

下面是另一个选项:

^[^0]*[0]{1}([^0]+[0]{1}[^0]*)+$
h79rfbju

h79rfbju2#

您可以选择:

^(?!.*00.*)(?=.*0.*0).*$

你可以玩它here
说明:

  • (?!.*00.*)输入不能有两个连续的0
  • (?=0.*0)输入必须包含至少两个0

如果您不想使用lookaround,请使用Maria的答案

vyswwuz2

vyswwuz23#

(1+01)* 0 (1+) 0 (1+10)*

这样就解决了问题

hjqgdpho

hjqgdpho4#

不如这样吧:

0[^0]+0

0后跟“非零”范围内的字符[^0]后跟零0

roejwanj

roejwanj5#

您发布的正则表达式是错误的,只需注意它有一个0+子序列,该子序列应该允许一个或多个0的序列。可以使用以下解决方案更正该问题:

1*011*0(10?)*

或与+运算子搭配使用

1*01+0(10?)*

对此的解释应该是:首先跳过所有以1*子模式开始的表达式,这样就得到了第一个0,然后跳过至少一个1,以及其后的所有1(子模式为1+)直到第二个0,因此我们刚刚匹配了与常规语言匹配的最小长度字符串。其余的都是可选的,我们需要重复任意次数的模式1,并在后面添加可选的0(如10?),或者应该有两个连续的0。您可以在demo中检查它,它包含所有可能的字符串(从1到8个字符),以及它们是否匹配。

hs1rzwqc

hs1rzwqc6#

如果至少有2个0,那么开头也有可能是1,那不就是1* 0 1* 0(1+01)* 但是如果按照给定的语言(开头和结尾都是2个0),那么就是0(1+01)* 0

bqujaahr

bqujaahr7#

1*01(1|01)*01*

我觉得这样会很好

ccrfmcuu

ccrfmcuu8#

给定语言至少包含两个零,但不包含连续零
该语言接受的字符串为L= {010,0101,0110,01010,01011110,.....}
匹配的正则表达式为:

1*01*(10+101*)^+

这里+表示至少出现一次。
以上语言的DFA显示在此链接中:
DFA IMAGE

相关问题