Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 接受字符串的正则表达式,其中每两个0后跟一个1_Regex_Automata - Fatal编程技术网

Regex 接受字符串的正则表达式,其中每两个0后跟一个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

因此,我正在寻找一种方法来编写一个接受所有字符串的正则表达式,但是在任何包含两个连续零的字符串中,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
解释

  • ^
    匹配行首
  • *
    匹配零次和无限次之间的任何字符
  • 001
    match literal 001
  • *
    匹配零次和无限次之间的任何字符
  • $
    匹配行尾

    • 我不确定自动机的正则表达式风格,但类似于

      ^.*001.*$
      
      相配

      0- 10- 01- 0010- 1111- 11001001- #match
      00- 000- 100 #no match
      001- 000- 100 #match
      00- 000- 1001 #match
      
      解释

      • ^
        匹配行首
      • *
        匹配零次和无限次之间的任何字符
      • 001
        match literal 001
      • *
        匹配零次和无限次之间的任何字符
      • $
        匹配行尾

      您可以为此使用一组嵌套的:

      ^(?!.*00(?!1)).*
      
      说明:

      ^#将正则表达式锚定到字符串的开头
      (?!#断言不可能匹配
      .#任意字符串(注意:如果字符串可能包含换行符,则需要(?s)修饰符)
      00#后接00
      (?!1)#除非后面跟着1
      )#展望结束
      .*#这与实际字符串匹配(如果前一个前瞻成功)
      #可以省略。*(但成功匹配将返回空字符串)
      

      测试它。

      您可以为此使用一组嵌套的:

      ^(?!.*00(?!1)).*
      
      说明:

      ^#将正则表达式锚定到字符串的开头
      (?!#断言不可能匹配
      .#任意字符串(注意:如果字符串可能包含换行符,则需要(?s)修饰符)
      00#后接00
      (?!1)#除非后面跟着1
      )#展望结束
      .*#这与实际字符串匹配(如果前一个前瞻成功)
      #可以省略。*(但成功匹配将返回空字符串)
      

      测试它。

      如果必须让00后跟1,这意味着以下两件事:

    • 子字符串000不在字符串中
    • 字符串不以后缀00结尾
    • 碰巧,上述两个条件也意味着任何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,这意味着以下两件事:

    • 子字符串000不在字符串中
    • 字符串不以后缀00结尾
    • 碰巧,上述两个条件也意味着任何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的字符串。请欣赏否决票评论。我误解了这个问题