如何构建一个关注出现次数而不是出现位置的正则表达式?

时间:2011-12-27 00:14:14

标签: regex

我想构建一个与以下字符串匹配的正则表达式:

包含全部或部分4个字符“A”,“B”,“C”和“D”的字符串

“ABCD”最多可以在任何位置发生一次。 例如,预计以下内容匹配:

A,AB,CABD,DC,BDCA,ABC,...

以下内容不匹配:

ABA,BB,ABCC,DDAA,AACD...

你对我有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这个应该这样做(Python语法):

if re.match(r"""
        # Match string having max one each of A, B, C or D.
        ^                      # Anchor to start of string.
        (?=[^A]*(?:A[^A]*)?$)  # Assert zero or one A max.
        (?=[^B]*(?:B[^B]*)?$)  # Assert zero or one B max.
        (?=[^C]*(?:C[^C]*)?$)  # Assert zero or one C max.
        (?=[^D]*(?:D[^D]*)?$)  # Assert zero or one D max.
        [ABCD]+                # One or more of [ABDC].
        \Z                     # Anchor to end of string.
        """, text, re.VERBOSE):
    # Successful match at the start of the string
else:
    # Match attempt failed

这是一个JavaScript版本:

var re = /^(?=[^A]*(?:A[^A]*)?$)(?=[^B]*(?:B[^B]*)?$)(?=[^C]*(?:C[^C]*)?$)(?=[^D]*(?:D[^D]*)?$)[ABCD]+$/;
if (re.test(text)) {
    // Successful match
} else {
    // Match attempt failed
}

答案 1 :(得分:1)

反转您的测试。尝试:

([ABCD]).*\1

即,查找4个字符中的一个,后面必须跟随一组任意字符(甚至为空),然后是您先匹配的字符。

如果您有匹配,则该字符串与您的期望不符。