电话不包含此图案AABBCC,例如112233

时间:2014-04-13 13:24:44

标签: php regex

我想检查手机是否包含此模式AABBCC 其中A [0-9],B [0-9],C [0,9]它们应该是不同的,例如112233,553322,887766

让我们假设 我有一个电话号码03334112233 它会说是匹配的模式。

PHP代码,但它是完全字符串

        $str = 'aabbaabbccaass'; //or whatever
        if (preg_match('/(?!.*?aabbcc)^.*$/', $str))
               echo "accepted\n";
        else
               echo "rejected\n";

问题我不知道如果字符串是数字

怎么办

Possible Duplicate 但它不包含答案和确切的细节。

已编辑: 我想匹配此模式AABBCC中字符串的最后6个字符,例如03329112233

4 个答案:

答案 0 :(得分:1)

要使用AABBCC格式匹配数字,您可以使用以下模式:

(?:(\d)\1(?!\1)){2}(\d)\2

使用示例:

if (preg_match('/(?:(\d)\1(?!\1)){2}(\d)\2/', $str)
    echo "rejected\n";
else
    echo "accepted\n";

但如果您还有其他测试要做(例如只有数字),以这种方式使用它会更灵活:

if (preg_match('/(?!.*(?:(\d)\1(?!\1)){2}(\d)\2)^\d+$/', $str)
    echo "accepted\n";
else
    echo "rejected\n";

模式细节:

(?:         # open a non capturing group that describes a repeated digit
    (\d)    # capture the first digit with group 1
    \1      # a backreference to group 1 (the same digit thus)
    (?!\1)  # check with a negative lookahead that the same digit doesn't follow
){2}        # repeat the group two times
(\d)\2      # same thing for digits 5 & 6 (the lookahead isn't needed here) 

请注意,捕获组中的数字会在非捕获组的每次重复时发生变化(因为负前瞻会强制它)。

注意:如果要拒绝包含例如111122或112222或111111的数字,则只需删除否定前瞻。
如果要拒绝格式为112211或448844的数字,则必须更改如下模式:(\d)\1(?!\d{0,2}\1)(\d)\2(?!\2)(\d)\3

答案 1 :(得分:0)

您可以像这样使用capturing groupsbackreferences

if (preg_match('/(?!.*(.)\1(.)\2(.)\3)^.*$/', $str))

(.)将匹配任何单个字符并将其分配给一个组。第一个实例分配给组1,第二个实例分配给组2,依此类推。在模式的后面,反向引用\1将完全匹配先前在第一组中捕获的内容,\2将匹配第二组中捕获的内容,等等。

您可能还希望使用\d来匹配任何单个数字(仅在前瞻之外使用此数字)和{n,m}量词来匹配 n m 位。例如,以下内容将匹配任何不包含AABBCC之类的子序列的7到10位数序列:

if (preg_match('/(?!.*(.)\1(.)\2(.)\3)^\d{7,10}$/', $str))

答案 2 :(得分:0)

你的正则表达式应该是这样的:

^((\d)\2){3}$

它更简单也有效。

答案 3 :(得分:0)

据我了解,您只想匹配字符串的最后6个字符(如果它们是数字)和3个所有不同的数字对。也会使用前瞻和一些这样的模式:

(?>((\d)\2)(?!.*\1)){3}$
  • \2检查相当于第二个捕获组,即一位数(shorthand \d
  • 使用否定lookahead检查,如果未跟.*任意数量的任何字符,则后跟等效的第一个捕获组(包含2个相等的数字)。
  • {3}$字符串末尾3次重复。

Test on regex101.comRegex FAQ