所以我正在寻找一种编写可以接受所有字符串的正则表达式的方法,但是在任何包含两个连续零的字符串中,必须立即跟随1 对于前。它会接受
0
10
01
0010
1111
11001001
但不是
00
000
100
答案 0 :(得分:1)
如果必须在00后面加上1,则表示以下两件事:
碰巧的是,以上两个条件也暗示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)
答案 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
匹配零到无限次之间的任何字符.*
匹配行尾