PHP:RegEx用于包含3-9个字母和5-50个数字的字符串

时间:2014-05-02 10:40:13

标签: php regex

如何在PHP中创建一个只接受3-9个字母(大写)和5-50个数字的RegEx?

我对正则表达式不太了解。但是这个不起作用:

/[A-Z]{3,9}[0-9]{5,50}/

例如,它匹配ABC12345但不匹配A12345BC

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

这是一个经典的"密码验证"类型问题。为此,"粗略的配方"是用一个先行检查每个条件,然后我们匹配所有。

^(?=(?:[^A-Z]*[A-Z]){3,9}[^A-Z]*$)(?=(?:[^0-9]*[0-9]){5,50}[^0-9]*$)[A-Z0-9]*$

我将在下面解释这一点,但这是我要留下的一个变体,以便你弄清楚。

^(?=(?:[^A-Z]*[A-Z]){3,9}[0-9]*$)(?=(?:[^0-9]*[0-9]){5,50}[A-Z]*$).*$

让我们一块一块地看一下正则表达式。

  1. 我们将正则表达式锚定在字符串^的头部和字符串$ assertions的结尾之间,确保匹配(如果有的话)是整个字符串。
  2. 我们有两个前瞻:一个用于大写字母,一个用于数字。
  3. 在前瞻之后,[A-Z0-9]*匹配整个字符串(如果它只包含大写的ASCII字母和数字)。 (感谢@TimPietzcker指出我在车轮上睡着了,因为那里有一个圆点星。)
  4. 前瞻如何运作?

    (?:[^A-Z]*[A-Z]){3,9}[^A-Z]*$)断言在当前位置,即字符串的开头,我们能够匹配"任何数量的非大写字母字符,后跟单个大写字母&#34 ;,3到9次。这确保我们有足够的大写字母。请注意,{3,9}是贪婪的,因此我们将匹配尽可能多的大写字母。但是我们不希望匹配超出我们希望允许的范围,因此在表达式量化{3,9}之后,先行检查我们可以匹配"零或任何数字"不是大写字母的字符,直到字符串的结尾,由锚$标记。

    第二个前瞻以类似的方式运作。

    有关此技术的更深入说明,您可能需要仔细阅读本页的密码验证部分regex lookarounds

    如果您感兴趣,以下是该技术的逐令牌解释。

    ^                      the beginning of the string
    (?=                    look ahead to see if there is:
     (?:                   group, but do not capture (between 3 and 9 times)
      [^A-Z]*              any character except: 'A' to 'Z' (0 or more times)
       [A-Z]               any character of: 'A' to 'Z'
     ){3,9}                end of grouping
      [^A-Z]*              any character except: 'A' to 'Z' (0 or more times)
    $                      before an optional \n, and the end of the string
    )                      end of look-ahead
    (?=                    look ahead to see if there is:
     (?:                   group, but do not capture (between 5 and 50 times)
      [^0-9]*              any character except: '0' to '9' (0 or more times)
       [0-9]               any character of: '0' to '9'
     ){5,50}               end of grouping
      [^0-9]*              any character except: '0' to '9' (0 or more times)
    $                      before an optional \n, and the end of the string
    )                      end of look-ahead
    [A-Z0-9]*              any character of: 'A' to 'Z', '0' to '9' (0 or more times)
    $                      before an optional \n, and the end of the string
    

答案 1 :(得分:3)

这是你的问题吗? http://regexr.com/38pn0

如果是这样,您需要将表达式锚定到字符串的开头和结尾:

/^[A-Z]{3,9}[0-9]{5,50}$/

请参阅结果:http://regexr.com/38pmt(不匹配)