正则表达式创建一个解决以下模式的表达式
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]*
可以有两个规则来产生需求,一个是 a
在 b
之前:
S₁ → [abc]* a [abc]* b [abc]*
另一个是 b
在 a
之前
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
或类似函数即可找出字符串是否包含 a
和 b
。正则表达式对于这项任务来说太重了。
描述
你真的想为此使用前瞻断言
^(?=.*a)(?=.*b)[abc]*$
此正则表达式将执行以下操作:
- 确保字符串仅包含字母
a
、b
和 c
- 要求字符串至少包含一个
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
完成
这是大学可选作业的一部分,我们有点吃力。
要解决的模式并没有那么难,老实说,我们没有绕过它,创建一个表达式,其字母表 {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]*
可以有两个规则来产生需求,一个是 a
在 b
之前:
S₁ → [abc]* a [abc]* b [abc]*
另一个是 b
在 a
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
或类似函数即可找出字符串是否包含 a
和 b
。正则表达式对于这项任务来说太重了。
描述
你真的想为此使用前瞻断言
^(?=.*a)(?=.*b)[abc]*$
此正则表达式将执行以下操作:
- 确保字符串仅包含字母
a
、b
和c
- 要求字符串至少包含一个
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
完成