我希望匹配一个字符串,如果它包含最多16位数字和最多11个字符,但总共最多包含27个字符。
我试过了(\d{0,16}\w{0,11}){27}
,但它似乎不起作用。
修改:
匹配: 145214mkjnkj
或1234567891011125abcdefghijk
(可以混合使用)
DONT MATCH: abababababab123
或12345678910111213abc
答案 0 :(得分:4)
只需删除尾随量词,并使用锚点来匹配字符串的开头和结尾:
/^(\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
的by-reference $replacements
参数,它将隐含地告诉我们在检查字符串中有多少字符时字符串中有多少位数: / p>
$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";
}
答案 1 :(得分:1)
我不认为使用REGEX可以轻松或有效地完成您想要的任务。据我了解你的问题,你希望有效字符串最多为27个字符,并且只包含数字和字符(由正则表达式\w
定义),最多只包含16位数字和11个字符。
要做到这一点,最好的办法是进行一些测试。
/[\d\w]{0,27}/
/\d/
然后计算匹配数/\w/
然后计算匹配数我认为将它包装成一个正则表达式没有任何好处。
NB 正如@nickb所指出的那样,\w
类包含\d
类,因此您似乎必须定义自己的字符类而不是\w
- 类似于[a-zA-Z_]
,匹配所有拉丁语(非外语重音字符)字母字符和下划线。