我想检查手机是否包含此模式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
答案 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 groups和backreferences:
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).*
任意数量的任何字符,则后跟等效的第一个捕获组(包含2个相等的数字)。{3}
在$
字符串末尾3次重复。