正则表达式排除101和110

时间:2009-11-08 14:44:00

标签: regex grammar

什么是正则表达式,它接受语言{0,1}上的所有内容但没有子串110或101?

接受:

  • 111111
  • 000011111
  • 100001000001001
  • 010
  • 1

拒绝:

  • 100110
  • 010100
  • 123

编辑:根据以下答案的评论,这个问题是要求正式的正则表达式。

6 个答案:

答案 0 :(得分:11)

这是解决方案(即使没有预测):

/^0*(11*$|10$|100+)*$/
  • 从任意数量的零开始。
  • 循环(知道:到目前为止解析的字符串不以“1”或“10”结尾)
    • “1 $”即可(& stop)
    • 如果你找到“11”,那么在你到达目的地之前你不能阅读除了那些之外的任何东西
    • “10 $”没关系。
    • 如果您阅读“10”并想继续,请阅读一个或多个零。然后回到循环。

答案 1 :(得分:6)

你最好检查是否匹配/101|110/

答案 2 :(得分:4)

这似乎有效,假设您的正则表达式引擎支持前瞻。

/^(1(?!01|10)|0)*$/

答案 3 :(得分:3)

仅限正式正则表达式:

((1|0*|0*1)(000*))*0*(10*|1*)

答案 4 :(得分:-1)

这应该有效:

/^([01])\1*$/

答案 5 :(得分:-1)

相应的DFA很容易绘制。

当受到可接受的“正式”正则表达式语法的限制时,没有相应的有限大小的正则表达式(缺少像“and”,“xor”,“not”这样的完整代数中必需的普通运算符)

但是有很多解决方案,比如这个

(0 | 100 |(1 | 10 | 11 *)$)*

它也可以用占有性匹配来解决。 (111 + $)是111 ++