-1

如果字符串最多包含 16 位数字和最多 11 个字符,但总共最多包含 27 个字符,我想匹配它。

我试过(\d{0,16}\w{0,11}){27}了,但它似乎不起作用。

编辑 :

MATCH: 145214mkjnkj1234567891011125abcdefghijk(可以混合)

不匹配: abababababab12312345678910111213abc

4

2 回答 2

4

只需去掉尾随量词,并使用锚来匹配字符串的开头和结尾:

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

where^匹配字符串的开头并$匹配字符串的结尾。现在这将匹配一个 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. 如果上面的检查通过,现在我们知道字符串只包含数字和字符,我们通过将所有数字替换为空字符串来测试它是否有足够的字符,并检查剩余的字符(仅是\wfamily) 是正确的长度。$count请注意此处命名的 by-reference 参数的使用,$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";
    }
    
于 2012-08-07T15:06:36.957 回答
1

我认为使用 REGEX 无法轻松或有效地完成您想要的操作。据我了解您的问题,您希望有效字符串的最大长度为 27 个字符,并且仅包含数字和字符(由 regex 定义\w)并且最多仅包含 16 个数字和 11 个字符。

为此,最好的办法是运行一些测试。

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

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

注意正如@nickb 所指出的,\w该类包含\d该类,因此您似乎必须定义自己的字符类来使用而不是\w- 类似于[a-zA-Z_]匹配所有拉丁语(不是外国重音字符)字母字符和下划线的东西。

于 2012-08-07T15:20:29.113 回答