此练习的解决方案是否为以下正则表达式?我在互联网上找到它,但我不相信这是正确的。
(1*011*(0+011*))*
根据“计算语言学和自然语言处理手册”一书中第1章的理论,我该如何解决这个问题呢?
我想要一个能满足下面常规语言的正则表达式
L = {010,0101,0110,0101010,01011110,.....}
答案 0 :(得分:2)
这是另一种选择:
^[^0]*[0]{1}([^0]+[0]{1}[^0]*)+$
答案 1 :(得分:1)
你可以选择:
^(?!.*00.*)(?=.*0.*0).*$
你可以玩它here。
说明:
(?!.*00.*)
输入无法连续两次0
(?=0.*0)
输入必须包含至少两个0
如果您不想使用环视,请使用Maria的回答
答案 2 :(得分:0)
这个怎么样:
0[^0]+0
零0
后跟一个范围内的字符"不是零" [^0]
后跟零0
。
答案 3 :(得分:0)
您发布的正则表达式是错误的,只需注意它有一个0+
子序列,它应该允许一个或多个0
的序列。可以使用此解决方案进行纠正:
1*011*0(10?)*
或使用+
运算符
1*01+0(10?)*
对它的解释应该是:首先跳过用1*
子模式开始表达的那些,所以你到达第一个0
,然后跳过至少一个 1
,以及跟随它的所有1
(使用子模式1+
)直到第二个0
,所以我们刚刚匹配了与您匹配的最小长度字符串常规语言。在这里,所有其余的都是可选的,我们需要重复模式1
的任意次数,并带有可选的尾随0
(如10?
中所示),或者应该连续两次{ {1}}秒。您可以在此demo中查看它,其中包含1到8个字符的所有可能字符串以及它们的匹配与否。