为包含最多1个字母的三个字母的字符串创建正则表达式?

时间:2017-02-03 17:28:33

标签: regex

如果我想将字符串与As,Bs,Cs匹配,但我的字符串不能包含多于1个B且不超过4Cs?我怎么做这个,不用很长时间?我有一个解决方案,我将字母B和Cs和A *的排列组合在一起。

正则表达式应匹配以下字符串:

AABCCCC

BAAACC

BAACACC

但不是这样的:

AABB

BBBACCC

CACACACC

2 个答案:

答案 0 :(得分:2)

你可以使用lookahead:

如果,强制要求至少1 B和1 C:

^(?=[^B]*B[^B]*$)(?=(?:[^C]*C[^C]*){1,4}$)[ABC]+$

否则:

^(?=[^B]*B?[^B]*$)(?=(?:[^C]*C[^C]*){0,4}$)[ABC]*$

<强>解释

^                   : begining of line
(?=                 : lookahead, make sure we have:
    [^B]*B[^B]*     : 0 or more non B arround one B
    $               : until end of line
)                   : end lookahead
(?=                 : lookahead, make sure we have:
    (?:             : start non capture group
        [^C]*C[^C]* : 0 or more non C arround one C
    ){1,4}          : 1 upto 4 times
    $               : until end of line
)                   : end lookahead
[ABC]+              : 1 or more any of these letters
$                   : end of line

答案 1 :(得分:1)

使用(基本)正则表达式是不可能的,因为计数将使语言大于常规语言可以处理的语言。您可以使用the pumping lemma for the regular languages

来证明这一点

如果可能,您应列出所有可能的内容。

另见this answer