我想匹配一个字符串,如果它包含最多16位数字和最多11个字符,但总共最多27个字符。我试过(\d{0,16}\w{0,11}){27}
,但它似乎不起作用。如何使用正则表达式查找字符串中数字和字符的确切数量?
编辑:
MATCH:145214mkjnkj
或1234567891011125abcdefghijk
(可混)
DONT MATCH:abababababab123
或12345678910111213abc
我想匹配一个字符串,如果它包含最多16位数字和最多11个字符,但总共最多27个字符。我试过(\d{0,16}\w{0,11}){27}
,但它似乎不起作用。如何使用正则表达式查找字符串中数字和字符的确切数量?
编辑:
MATCH:145214mkjnkj
或1234567891011125abcdefghijk
(可混)
DONT MATCH:abababababab123
或12345678910111213abc
刚刚摆脱尾随量词和使用锚匹配字符串的开头和结尾:
/^(\d{0,16}\w{0,11})$/
其中^
匹配字符串的开始,$
匹配字符串的结尾。现在这将匹配0-16个字符的字符串,然后是0-11个字符。请记住\w
包括[A-Za-z0-9_]
,如果你想只匹配字母字符,你可以这样做:
/^(\d{0,16}[a-z]{0,11})$/i
编辑:由于(显然)数字和字符可以混合使用,可以使用一个正则表达式来测试无效字符,然后做一些额外的处理,以确定是否为每个字符类的最低要求得到满足与另一个正则表达式,像这样:
首先是检查是否字符串包含任何无效字符。如果这个匹配,我们知道该字符串是无效:
if(preg_match('/[^\d\w]/', $input)) {
echo "Invalid input - Only digits and characters allowed.\n";
}
注:上述假设\w
的字符,只有字母字符,使用A-Za-z
。
如果上面的检查通过了,现在我们知道该字符串只包含数字和字符,我们通过用空字符串替换所有数字来检查它是否有足够的字符,并检查其余字符只有那些在\w
系列)是正确的长度。注意使用按引用$count
参数,这里命名$replacements
,这将隐式告诉我们有多少个数字出现在字符串中,而我们正在检查多少字符的字符串:
$only_characters = preg_replace('/\d/', '', $input, -1, $replacements);
if(strlen($only_characters) > 11) {
echo "Invalid input - You can only have at most 11 characters\n";
}
if($replacements > 16) {
echo "Invalid input - You can only have at most 16 digits\n";
}
我不认为你想要的东西可以通过REGEX轻松或高效地完成。根据我的理解你的问题,你希望有效的字符串最长为27个字符,并且只包含数字和字符(由正则表达式\w
定义),最多只有16个数字和11个字符。
要做到这一点,最好的办法是运行一些测试。
/[\d\w]{0,27}/
/\d/
然后计算匹配数/\w/
然后计算匹配的数量我没有看到任何包装成一个正则表达式的好处。
N.B.正如@nickb指出的那样,\w
类包含\d
类,这样看来,你必须定义自己的角色职业,而不是使用\w
- 像[a-zA-Z_]
相匹配整个拉丁美洲(不对外重音字符)字母字符和下划线。
数字和数字可以混合使用吗?当然是 – 2012-08-07 15:07:23
!你可以混合它! – trouble 2012-08-08 07:28:08
它可以匹配'123abc456def'吗? – 2012-08-08 08:03:09