【问题标题】:Regular expression to match string of 0's and 1's without '011' substring正则表达式匹配 0 和 1 的字符串,没有 '011' 子字符串
【发布时间】:2010-04-17 09:53:10
【问题描述】:

我正在解决一个问题(来自 Hopcroft、Motwani 和 Ullman 的自动机理论、语言和计算机简介)编写一个正则表达式,该表达式定义一种由所有 @987654321 字符串组成的语言@s 和1s 不包含子字符串011

答案(0+1)* - 011 正确吗?如果不是,那么正确的答案应该是什么?

【问题讨论】:

  • 如果你在一个小时后就放弃了,我建议你更努力地搜索一下。
  • 我没有给你答案,但试试这个:绘制一个接受 011 作为输入然后否定它的有限状态机(图)(所有接受状态都是不接受,不接受是接受)。您应该能够从那里解决正则表达式,因为它也是一个有限状态机。
  • 同样的技巧也适用,绘制一个接受任何包含 011 的字符串的有限状态机(图)...

标签: regex compiler-construction grammar automata


【解决方案1】:

编辑:更新为包括启动状态和修复,如下面的 cmets。

【讨论】:

  • 正如你提到的自动机,我想我会画一些,因为它们很有趣! :)。两者都是确定性有限状态。如果解释性不够,我很乐意回答有关其构造的问题。 (或纠正任何错误)。希望这会有所帮助!
  • 您没有指示起始状态的箭头! (来自老师的-1)但我们会假设最左边的。第二个在钱上是对的,第一个是错的。如果您只接受 011,则所有指向最左边状态的箭头都应该指向最右边的状态,因为在这些情况下,011 将永远无法实现。
  • 是的,你是对的。我已经修复了图像。它以前会拒绝(某些)以 011 结尾的字符串。
  • 我不认为你的第一个图是正确的,当它到达最后一个状态时,011 将被接受。
  • @Blake 你是对的;那是“除了字符串 011 之外的所有内容”的机器。最初的问题不清楚 OP 正在寻找哪个。第 2 台机器更符合当前的问题。
【解决方案2】:

如果您要查找所有没有011 作为子字符串的字符串,而不是简单地排除字符串011

一个经典的正则表达式是:

1*(0+01)*

基本上,您可以在开始时拥有任意数量的 1,但是一旦您击中零,它要么是零,要么是零一(否则你会得到一个零一一) .

一个现代的、不是很常规的正则表达式是:

^((?!011)[01])*$

但是,如果您想要任何不是011 的字符串,您可以简单地枚举短字符串并通配符其余部分:

λ+0+1+00+01+10+11+(1+00+010)(0+1)*

在现代正则表达式中:

^(?!011)[01]*$

【讨论】:

  • λ+0+1+00+01+10+11+(1+00+010)(0+1)* 你是如何接触到这个 RE 的?
  • 第一部分是所有小于3个字符的字符串的枚举。第二部分是011不能开始的字符串,后面是任意数据。
  • 你的答案是错误的。 1*(0+01)* 不接受10,也不接受101。
  • 你的答案1*(0+01)*怎么会不接受011。你能解释一下吗?
  • @PrasannaSasne 您可以使用regexr.com 来解释正则表达式的各个部分。简而言之,1*(0+01)*011 不匹配,因为它接受的唯一1s 是开头的1(正则表达式中的1*)或1,它也以@987654338 为前缀@((0+01)* 正则表达式中的01
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2022-01-17
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
相关资源
最近更新 更多