正则表达式创建一个解决以下模式的表达式

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.

问候

ken*_*ytm 6

可以有两个规则来产生需求,一个是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.正则表达式对于此任务来说太沉重了.


Cas*_*yte 5

作为@ 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)