接受字符串的正则表达式,其中每两个零后面跟一个零

时间:2019-04-22 07:13:36

标签: regex automata

所以我正在寻找一种编写可以接受所有字符串的正则表达式的方法,但是在任何包含两个连续零的字符串中,必须立即跟随1 对于前。它会接受

0
10
01
0010
1111
11001001

但不是

00
000
100

3 个答案:

答案 0 :(得分:1)

如果必须在00后面加上1,则表示以下两件事:

  1. 子字符串000不在字符串中
  2. 字符串不以后缀00结尾

碰巧的是,以上两个条件也暗示00的任何实例必须后跟1;这些条件是等效的。单独提供条件将使解决此问题变得更加容易。

为这种语言写下确定性的有限自动机很容易;像这样的东西就足够了:

        /---1----\----1---\           /--\
        V        |        |           V   \
----->(q0)--0-->(q1)--0-->(q2)--0-->(q3)  0,1
      \  ^                             \---/
       \1/

状态(q0)(q1)被接受,状态(q2)(q3)被接受。 (q3)处于无效状态,因为根据条件1,任何具有三个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),我们的正则表达式将是这两个表达式的并集(+)。由于不需要(q3),因此我们可以忽略它,并使用替换:

(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)

答案 1 :(得分:0)

您可以为此使用一组嵌套的negative lookahead assertions

^(?!.*00(?!1)).*

说明:

^      # Anchor the regex to the start of the string
(?!    # Assert that it's impossible to match
 .*    #  any string (caveat: if your string might contain newlines, you need the (?s) modifier)
 00    #  followed by 00
 (?!1) #  unless that is followed by 1
)      # End of lookahead
.*     # This matches the actual string (if the previous lookahead was successful)
       # The .* can be omitted (but then the successful matches will return an empty string)

测试live on regex101.com

答案 2 :(得分:-1)

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

XMLReader xr = NamespaceFilter.nameSpaceFilter();
        Source src = new SAXSource(xr, new InputSource("filePath"));
        StringWriter sw = new StringWriter();
        Result res = new StreamResult(sw);
        TransformerFactory.newInstance().newTransformer().transform(src, res);
        JAXBContext jc = JAXBContext.newInstance(Tab.class);
        Unmarshaller u = jc.createUnmarshaller();
        String done = sw.getBuffer().toString();
        StringReader reader = new StringReader(done);
        Tab tab = (Tab) u.unmarshal(reader);

        System.out.println(tab);

会匹配

^.*001.*$

说明

  • 0- 10- 01- 0010- 1111- 11001001- #match 00- 000- 100 #no match 001- 000- 100 #match 00- 000- 1001 #match 匹配行首
  • ^匹配零到无限次之间的任何字符
  • .*匹配文字001
  • 001匹配零到无限次之间的任何字符
  • .*匹配行尾