正则表达式匹配0和1的字符串,没有'011'子字符串

Pra*_*rav 5 regex compiler-construction grammar automata

我正在研究一个问题(从介绍到自动机理论,语言和计算机,由Hopcroft,Motwani和Ullman编写)来编写一个正则表达式,它定义了一个由不包含子字符串的所有0s和1s 字符串组成的语言011.

答案(0+1)* - 011是否正确?如果不是这个应该是什么正确的答案?

RJF*_*ner 10

自动机图 编辑:更新以包括开始状态和修复,如下面的注释.

  • 你没有指示起始状态的箭头!(来自老师的-1)但是我们假设我们最左边.第二个是钱,第一个是错的.如果你只接受011,那么所有朝向最左边状态的箭头都应该朝向最右边的状态,因为在那些情况下,011永远不会再实现. (3认同)

Max*_*keh 5

如果您正在查找没有011子字符串的所有字符串,而不是简单地排除该字符串011

\n\n

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

\n\n
1*(0+01)*\n
Run Code Online (Sandbox Code Playgroud)\n\n

基本上,一开始你可以有任意多个,但是一旦你达到零,它要么是零,要么是零个一(因为否则你会得到一个零一一)。

\n\n

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

\n\n
^((?!011)[01])*$\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n
\xce\xbb+0+1+00+01+10+11+(1+00+010)(0+1)*\n
Run Code Online (Sandbox Code Playgroud)\n\n

在现代正则表达式中:

\n\n
^(?!011)[01]*$\n
Run Code Online (Sandbox Code Playgroud)\n

  • 你的答案是错误的。1*(0+01)* 不接受 10,也不接受 101。 (3认同)