2012-08-07 36 views
-1

我想匹配一个字符串,如果它包含最多16位数字和最多11个字符,但总共最多27个字符。我试过(\d{0,16}\w{0,11}){27},但它似乎不起作用。如何使用正则表达式查找字符串中数字和字符的确切数量?

编辑:

MATCH:145214mkjnkj1234567891011125abcdefghijk(可混)

DONT MATCH:abababababab12312345678910111213abc

+1

数字和数字可以混合使用吗?当然是 – 2012-08-07 15:07:23

+0

!你可以混合它! – trouble 2012-08-08 07:28:08

+0

它可以匹配'123abc456def'吗? – 2012-08-08 08:03:09

回答

3

刚刚摆脱尾随量词和使用锚匹配字符串的开头和结尾:

/^(\d{0,16}\w{0,11})$/ 

其中^匹配字符串的开始,$匹配字符串的结尾。现在这将匹配0-16个字符的字符串,然后是0-11个字符。请记住\w包括[A-Za-z0-9_],如果你想只匹配字母字符,你可以这样做:

/^(\d{0,16}[a-z]{0,11})$/i 

编辑:由于(显然)数字和字符可以混合使用,可以使用一个正则表达式来测试无效字符,然后做一些额外的处理,以确定是否为每个字符类的最低要求得到满足与另一个正则表达式,像这样:

  1. 首先是检查是否字符串包含任何无效字符。如果这个匹配,我们知道该字符串是无效

    if(preg_match('/[^\d\w]/', $input)) { 
        echo "Invalid input - Only digits and characters allowed.\n"; 
    } 
    

    注:上述假设\w的字符,只有字母字符,使用A-Za-z

  2. 如果上面的检查通过了,现在我们知道该字符串只包含数字和字符,我们通过用空字符串替换所有数字来检查它是否有足够的字符,并检查其余字符只有那些在\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"; 
    } 
    
+0

对!我尝试它,这不工作! – trouble 2012-08-08 07:41:48

+0

@trouble - 您在原始问题中的要求不明确。我已经调整了我的答案以符合您的更改。 – nickb 2012-08-08 12:47:08

+0

@nickb我删除了我的评论 - 所有的证据都没有了......我的观点仍然存在 – 2012-08-08 12:49:27

1

我不认为你想要的东西可以通过REGEX轻松或高效地完成。根据我的理解你的问题,你希望有效的字符串最长为27个字符,并且只包含数字和字符(由正则表达式\w定义),最多只有16个数字和11个字符。

要做到这一点,最好的办法是运行一些测试。

  1. 它是否仅匹配0到27个字符之间的单词和数字;正则表达式:/[\d\w]{0,27}/
  2. 是否有16位或更少;正则表达式:/\d/然后计算匹配数
  3. 是否有11个字符或更少;正则表达式:/\w/然后计算匹配的数量

我没有看到任何包装成一个正则表达式的好处。

N.B.正如@nickb指出的那样,\w类包含\d类,这样看来,你必须定义自己的角色职业,而不是使用\w - 像[a-zA-Z_]相匹配整个拉丁美洲(不对外重音字符)字母字符和下划线。

相关问题