我最近开始学习正则表达式,并试图为上面的问题编写一个。如果限制只放在一个字母上(例如不超过2“b”),那就不难了。
然后答案是:a * c *(b |ε)a * c *(b |ε)a * c *
但是对于2“b”和3“c”s,“a”之间可能的排序总数是24(5选3),所以写一个正则表达式来包含所有这些可能性将非常hefty(因为我们可以选择任意数量的b和cs,只要数字分别小于2和3)(例如bcbcc,cbbcc,bcbc,bcc,b,c,...)。
那么是否可以为问题编写一个简洁的正则表达式,或者至少可以通过简化来写出可能性?
答案 0 :(得分:1)
怎么样:
^(?=(?:[ac]*b){1,2}[ac]*$)(?=(?:[ab]*c){1,3}[ab]*$)
<强>解释强>
^ : begining of string
(?= : look ahead
(?: : non capture group
[ac]* : letters a or c 0 or more times
b : letter b
){1,2} : the group must be present once or twice
[ac]* : letters a or c 0 or more times
$ : end of string
)
(?= : look ahead
(?: : non capture group
[ab]* : letters a or b 0 or more times
c : letter c
){1,3} : the group must be present once or three times
[ab]* : letters a or b 0 or more times
$ : end of string
)
答案 1 :(得分:-1)
我认为在这种情况下你想要否定你正在寻找的东西,因为找到两个以上的b或c很容易。你可以这样做(?!.*b.*b.*|.*c.*c.*c.*)
并说,不再是2 b和3 c