Regex 接受字符串的正则表达式,其中每两个0后跟一个1
因此,我正在寻找一种方法来编写一个接受所有字符串的正则表达式,但是在任何包含两个连续零的字符串中,1必须紧跟其后 例如,它可以接受Regex 接受字符串的正则表达式,其中每两个0后跟一个1,regex,automata,Regex,Automata,因此,我正在寻找一种方法来编写一个接受所有字符串的正则表达式,但是在任何包含两个连续零的字符串中,1必须紧跟其后 例如,它可以接受 0 10 01 0010 1111 11001001 但不是 00 000 100 我不确定自动机的正则表达式风格,但类似于 ^.*001.*$ 相配 0- 10- 01- 0010- 1111- 11001001- #match 00- 000- 100 #no match 001- 000- 100 #match 00- 000- 1001 #match
0
10
01
0010
1111
11001001
但不是
00
000
100
我不确定自动机的正则表达式风格,但类似于
^.*001.*$
相配
0- 10- 01- 0010- 1111- 11001001- #match
00- 000- 100 #no match
001- 000- 100 #match
00- 000- 1001 #match
解释
匹配行首^
匹配零次和无限次之间的任何字符*
match literal 001001
匹配零次和无限次之间的任何字符*
匹配行尾$
- 我不确定自动机的正则表达式风格,但类似于
^.*001.*$
相配
0- 10- 01- 0010- 1111- 11001001- #match
00- 000- 100 #no match
001- 000- 100 #match
00- 000- 1001 #match
解释
匹配行首^
匹配零次和无限次之间的任何字符*
match literal 001001
匹配零次和无限次之间的任何字符*
匹配行尾$
^(?!.*00(?!1)).*
说明:
^#将正则表达式锚定到字符串的开头
(?!#断言不可能匹配
.#任意字符串(注意:如果字符串可能包含换行符,则需要(?s)修饰符)
00#后接00
(?!1)#除非后面跟着1
)#展望结束
.*#这与实际字符串匹配(如果前一个前瞻成功)
#可以省略。*(但成功匹配将返回空字符串)
测试它。您可以为此使用一组嵌套的:
^(?!.*00(?!1)).*
说明:
^#将正则表达式锚定到字符串的开头
(?!#断言不可能匹配
.#任意字符串(注意:如果字符串可能包含换行符,则需要(?s)修饰符)
00#后接00
(?!1)#除非后面跟着1
)#展望结束
.*#这与实际字符串匹配(如果前一个前瞻成功)
#可以省略。*(但成功匹配将返回空字符串)
测试它。如果必须让00后跟1,这意味着以下两件事:
/---1----\----1---\ /--\
V | | V \
----->(q0)--0-->(q1)--0-->(q2)--0-->(q3) 0,1
\ ^ \---/
\1/
州(q0)
和(q1)
接受,州(q2)
和(q3)
不接受<代码>(q3)是一种死状态,因为根据条件1,任何带有三个0的字符串在我们的语言中都不是0,并且无法赎回<代码>(q2)不是死状态,因为我们可以通过在末尾添加1
来修复此字符串
有了DFA,我们可以应用已知的算法生成正则表达式。我们可以写下一个系统:
(q0) = e + (q0)1 + (q1)1 + (q2)1
(q1) = (q0)0
(q2) = (q1)0
(q3) = (q2)0 + (q3)(0 + 1)
现在我们要求解(q0)
和(q1)
,我们的正则表达式将是这两个表达式的并集(+
)。我们可以忽略(第三季度)
,因为它不需要并使用替换:
(q0) = e + (q0)1 + (q0)01 + (q2)1
(q1) = (q0)0
(q2) = (q0)00
(q0) = e + (q0)1 + (q0)01 + (q0)001
(q1) = (q0)0
(q2) = (q0)00
(q0) = e + (q0)(1 + 01 + 001)
(q1) = (q0)0
(q2) = (q0)00
(q0) = (1 + 01 + 001)*
(q1) = (1 + 01 + 001)*0
(q2) = (1 + 01 + 001)*00
因此,我们的答案是
(1+01+001)*+(1+01+001)*0=(1+01+001)*(e+0)
如果我们必须让00后跟1,这意味着以下两件事:
/---1----\----1---\ /--\
V | | V \
----->(q0)--0-->(q1)--0-->(q2)--0-->(q3) 0,1
\ ^ \---/
\1/
州(q0)
和(q1)
接受,州(q2)
和(q3)
不接受<代码>(q3)是一种死状态,因为根据条件1,任何带有三个0的字符串在我们的语言中都不是0,并且无法赎回<代码>(q2)不是死状态,因为我们可以通过在末尾添加1
来修复此字符串
有了DFA,我们可以应用已知的算法生成正则表达式。我们可以写下一个系统:
(q0) = e + (q0)1 + (q1)1 + (q2)1
(q1) = (q0)0
(q2) = (q1)0
(q3) = (q2)0 + (q3)(0 + 1)
现在我们要求解(q0)
和(q1)
,我们的正则表达式将是这两个表达式的并集(+
)。我们可以忽略(第三季度)
,因为它不需要并使用替换:
(q0) = e + (q0)1 + (q0)01 + (q2)1
(q1) = (q0)0
(q2) = (q0)00
(q0) = e + (q0)1 + (q0)01 + (q0)001
(q1) = (q0)0
(q2) = (q0)00
(q0) = e + (q0)(1 + 01 + 001)
(q1) = (q0)0
(q2) = (q0)00
(q0) = (1 + 01 + 001)*
(q1) = (1 + 01 + 001)*0
(q2) = (1 + 01 + 001)*00
因此,我们的答案是
(1+01+001)*+(1+01+001)*0=(1+01+001)*(e+0)
这并不是作者想要的。查找001不是必需的,但拒绝包含00且后面不跟1的字符串。请欣赏否决票评论。我误解了这个问题,这并不是作者想要的。查找001不是必需的,但拒绝包含00且后面不跟1的字符串。请欣赏否决票评论。我误解了这个问题