如何在PHP中创建一个只接受3-9个字母(大写)和5-50个数字的RegEx?
我对正则表达式不太了解。但是这个不起作用:
/[A-Z]{3,9}[0-9]{5,50}/
例如,它匹配ABC12345
但不匹配A12345BC
有什么想法吗?
答案 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]*$).*$
让我们一块一块地看一下正则表达式。
[A-Z0-9]*
匹配整个字符串(如果它只包含大写的ASCII字母和数字)。 (感谢@TimPietzcker指出我在车轮上睡着了,因为那里有一个圆点星。)前瞻如何运作?
(?:[^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(不匹配)