用于验证字母和数字的正则表达式不能按预期工作

时间:2013-03-14 13:41:53

标签: javascript regex

我正在尝试创建一个包含17个字符的正则表达式,必须包含强制数字和字母,并且不得包含字母I,O,Q,Ñ。目前我得到了:

^(([a-h]|[j-n]|p|[r-z]|[A-H]|[J-N]|P|[R-Z]|[0-9]){17})$

但是如果我只输入数字或只输入字母,那么正则表达式会将其验证为好。

2 个答案:

答案 0 :(得分:4)

通常在这种情况下,您希望使用positive lookahead来断言输入满足其他条件。由于此处有两个条件(必须至少包含一个数字,必须至少包含一个字母),因此这将转换为两个不同的前瞻。

与可用性的额外空格和“注释”一起,正则表达式应如下所示:

^
(?=.*[a-hj-npr-zA-HJ-NPR-Z].*)  // assert the input contains at least one letter
(?=.*[0-9].*)                   // assert the input contains at least one digit
[a-hj-npr-zA-HJ-NPR-Z0-9]{17}   // existing condition (17 allowed chars exactly)
$

答案 1 :(得分:3)

使用正面和负面预测来要求和禁止字符:

/^(?=.*[0-9])(?=.*[A-Za-z])(?!.*[ioqñIOQÑ])[0-9a-zA-Z]{17}$/.test(s);

演示:http://jsfiddle.net/2mNyg/

说明

(?=.*[0-9])        - requires a digit
(?=.*[A-Za-z])     - requires a letter
(?!.*[ioqñIOQÑ])   - disallows all characters in the set
[0-9a-zA-Z]{17}    - allow basic set and require 17 characters

注意:不允许的字符也会满足需要字母的前瞻,但不允许字符的前瞻仍会停止。这样你就可以使表达式更简单。