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

Regex create a expression solving the following pattern

这是大学可选作业的一部分,我们有点吃力。

要解决的模式并没有那么难,老实说,我们没有绕过它,创建一个表达式,其字母表 {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.*?b)|(b.*?a)).*/

您可以为此使用积极的先行断言:

(?=.*a)(?=.*b)

要return匹配中的字符,需要非断言匹配

[abc]*(?=.*a)(?=.*b)[abc]*

可以有两个规则来产生需求,一个是 ab 之前:

S₁ → [abc]* a [abc]* b [abc]*

另一个是 ba

之前
S₂ → [abc]* b [abc]* a [abc]*

现在只需使用替代运算符将它们组合在一起,

S → S₁ | S₂
  = [abc]* a [abc]* b [abc]* | [abc]* b [abc]* a [abc]*

这可以使用规则 AB|AC = A(B|C)AC|BC = (A|B)C:

来简化
S → [abc]* (a [abc]* b | b [abc]* a) [abc]*

我假设你的作业只涉及正式语言。在实际编程中,只需使用 indexOf 或类似函数即可找出字符串是否包含 ab。正则表达式对于这项任务来说太重了。

描述

你真的想为此使用前瞻断言

^(?=.*a)(?=.*b)[abc]*$

此正则表达式将执行以下操作:

  • 确保字符串仅包含字母 abc
  • 要求字符串至少包含一个a
  • 要求字符串至少包含一个b

例子

现场演示

https://regex101.com/r/uK7hZ8/1

示例文本

dabc
fbca
cab
bac
acb
cba

样本匹配

cab
bac
acb
cba

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of a "line"
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
    a                        'a'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
    b                        'b'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  [abc]*                   any character of: 'a', 'b', 'c' (0 or more
                           times (matching the most amount possible))
----------------------------------------------------------------------
  $                        before an optional \n, and the end of a
                           "line"
----------------------------------------------------------------------

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

或使用类:

c*(a[ac]*b|b[bc]*a)[abc]*

首先这是一个最好不用正则表达式解决的教科书问题:

set(input) < set("ab")

现在,试一试,注意非常受限的字母表

因此,问题等同于:

"acccccb" in input + reversed(input)

对于 c 上的任意重复次数;因此你的表达变成:

ac*b|bc*a

完成