这是大学可选作业的一部分,我们有点挣扎。
要解决的模式并不难以说实话我们不能理解它,创建一个字母{a,b,c}包含至少一个{{1}的表达式和a
一个。
b
但是这两个都有缺陷,首先不允许ccbacc第二个允许ccaacc。
问候
答案 0 :(得分:6)
生成要求可以有两个规则,一个是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
。正则表达式对于此任务来说太沉重了。
答案 1 :(得分: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"
或使用类:
c*(a[ac]*b|b[bc]*a)[abc]*
答案 2 :(得分:2)
你真的想为这个
使用先行断言^(?=.*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"
----------------------------------------------------------------------
答案 3 :(得分:1)
试试这个:
/.*?((a.*?b)|(b.*?a)).*/
答案 4 :(得分:1)
您可以使用正向前瞻断言:
(?=.*a)(?=.*b)
要返回匹配中的字符,您需要一个非断言匹配
[abc]*(?=.*a)(?=.*b)[abc]*
答案 5 :(得分:0)
首先关闭这是一个没有正则表达式的最佳解决的教科书问题:
set(input) < set("ab")
现在,要进行旋转,请注意受限字母。
因此,问题等同于:
"acccccb" in input + reversed(input)
c
的任意重复次数;这样你的表达就变成了:
ac*b|bc*a
完成强>