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

Regex 正则表达式创建一个表达式来解决以下模式,regex,formal-languages,Regex,Formal Languages,这是大学自选作业的一部分,我们有点挣扎 要解决的模式并不难,老实说,我们不去想它,创建一个表达式,它的字母表{a,b,c}至少包含一个a和一个b 目前的两种方法是 (a | b | c)*a(a | b | c)*b(a | b | c)*或(a | b | c)(a | b | c)*(a | b)(a | b | c)* 但这两个都有缺陷,第一个不允许ccbacc,第二个允许ccaacc 问候语试试这个: /.*?((a.*?b)|(b.*?a)).*/ 试试这个: /.*?((a.*?b

这是大学自选作业的一部分,我们有点挣扎

要解决的模式并不难,老实说,我们不去想它,创建一个表达式,它的字母表{a,b,c}至少包含一个
a
和一个
b

目前的两种方法是

(a | b | c)*a(a | b | c)*b(a | b | c)*或(a | b | c)(a | b | c)*(a | b)(a | b | c)*

但这两个都有缺陷,第一个不允许ccbacc,第二个允许ccaacc

问候语

试试这个:

/.*?((a.*?b)|(b.*?a)).*/
试试这个:

/.*?((a.*?b)|(b.*?a)).*/

您可以为此使用正向前瞻断言:

(?=.*a)(?=.*b)
要返回匹配中的字符,需要非断言匹配

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

您可以为此使用正向前瞻断言:

(?=.*a)(?=.*b)
要返回匹配中的字符,需要非断言匹配

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

可以有两条规则来生成需求,一条是a
b
之前的
a

S₁ → [abc]* a [abc]* b [abc]*
另一个是
a
a之前的
b

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
来简化:



我想你的家庭作业只涉及正式语言。在实际编程中,只需使用
indexOf
或类似函数来确定字符串是否包含
a
b
。Regex对于这项任务来说太重了。

可以有两条规则来生成需求,一条是a
a
在a
b
之前:

S₁ → [abc]* a [abc]* b [abc]*
另一个是
a
a之前的
b

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
来简化:


我想你的家庭作业只涉及正式语言。在实际编程中,只需使用
indexOf
或类似函数来确定字符串是否包含
a
b
。正则表达式对于此任务来说太重。

Description 您真的希望对此使用前瞻断言

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

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

  • 确保字符串仅包含字母
    a
    b
    c
  • 要求字符串至少包含一个
    a
  • 要求字符串至少包含一个
    b
例子 现场演示

示例文本

dabc
fbca
cab
bac
acb
cba
样本匹配

cab
bac
acb
cba
解释 描述 您真的希望对此使用前瞻断言

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

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

  • 确保字符串仅包含字母
    a
    b
    c
  • 要求字符串至少包含一个
    a
  • 要求字符串至少包含一个
    b
例子 现场演示

示例文本

dabc
fbca
cab
bac
acb
cba
样本匹配

cab
bac
acb
cba
解释
作为对@kennytm答案的补充,如果您以针对第一次出现的字符“a”和“b”(而不是任何地方)的方式编写模式,则可以省略一些字母。显然,这两种方法完全匹配一件事:

c*(a(a | c)*b | b(b | c)*a)(a | b | c)*
^^^---------在第一个“a”之前只需要“b”和“c”
|“----------------------------在第一个“b”之前只需要“a”和“c”
“-------------------------------在第一个“a”或第一个“b”之前只需要“c”
或使用类:

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

作为对@kennytm答案的补充,如果您以针对第一次出现的字符“a”和“b”(而不是任何地方)的方式编写模式,则可以省略一些字母。显然,这两种方法完全匹配一件事:

c*(a(a | c)*b | b(b | c)*a)(a | b | c)*
^^^---------在第一个“a”之前只需要“b”和“c”
|“----------------------------在第一个“b”之前只需要“a”和“c”
“-------------------------------在第一个“a”或第一个“b”之前只需要“c”
或使用类:

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

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

set(input) < set("ab")
对于
c
上的任意重复量;因此,您的表达变成:

ac*b|bc*a

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

set(input) < set("ab")
对于
c
上的任意重复量;因此,您的表达变成:

ac*b|bc*a

完成

可能使用先行断言
(?=…)
可能使用先行断言
(?=…)
在这个地方不需要非断言匹配吗?类似于类
[abc]
,因此
[abc]*(?=.*a)(?=.*b)[abc]*
?在这个地方不需要非断言匹配吗?类似于类
[abc]
,因此
[abc]*(?=.*a)(?=.*b)[abc]*
?这与所述字母表之外的字符串相匹配,如
adb
。只需将点替换为
[abc]
。不要忘记在开始和结束处锚定表达式。这与所述字母表之外的字符串相匹配,如
adb
。只需将点替换为
[abc]
。别忘了在开头和结尾锚定表达式Yep这是我们正式语言介绍lecutre的一部分,我们真的无法理解,非常感谢解释:)是的,这是正式语言介绍lecutre的一部分,我们真的无法理解,非常感谢解释:)这是一个非常好的解释,从程序员的角度出发,但我们还没有介绍这些概念中的大多数,比如从学习@kennytm给出的答案的角度出发的前瞻性更符合目的。这是一个非常好的解释