joa*_*him 1 regex formal-languages
这是大学可选作业的一部分,我们有点挣扎.
要解决的模式并不难说实话,我们不会理解它,创建一个字母{a,b,c}包含至少一个a和一个的表达式b.
目前的两种方法是
(a|b|c)*a(a|b|c)*b(a|b|c)* or (a|b|c)(a|b)(a|b|c)*(a|b)(a|b|c)*
但是这两个都有缺陷首先不允许ccbacc第二个允许ccaacc.
问候
可以有两个规则来产生需求,一个是a在a之前b:
S? ? [abc]* a [abc]* b [abc]*
Run Code Online (Sandbox Code Playgroud)
另一个是b前一个a
S? ? [abc]* b [abc]* a [abc]*
Run Code Online (Sandbox Code Playgroud)
现在只需使用替代运算符将它们组合在一起,
S ? S? | S?
= [abc]* a [abc]* b [abc]* | [abc]* b [abc]* a [abc]*
Run Code Online (Sandbox Code Playgroud)
这可以通过使用规则来简化AB|AC = A(B|C)和AC|BC = (A|B)C:
S ? [abc]* (a [abc]* b | b [abc]* a) [abc]*
Run Code Online (Sandbox Code Playgroud)
我认为你的作业只涉及正式语言.在实际编程中,只需使用indexOf或类似的函数来查明字符串是否包含a a和a b.正则表达式对于此任务来说太沉重了.
作为@ kennytm的答案的补充,如果你以一种针对第一次出现的字符"a"和"b"(而不是任何地方)的方式编写模式,可以省略一些字母.显然,这两种方法完全相同:
c*(a(a|c)*b|b(b|c)*a)(a|b|c)*
^ ^ ^---------------- only need "b" and "c" until the first "a"
| '------------------------- only need "a" and "c" until the first "b"
'----------------------------- only need "c" until the first "a" or the first "b"
Run Code Online (Sandbox Code Playgroud)
或使用类:
c*(a[ac]*b|b[bc]*a)[abc]*
Run Code Online (Sandbox Code Playgroud)