我正在尝试创建一个包含17个字符的正则表达式,必须包含强制数字和字母,并且不得包含字母I,O,Q,Ñ。目前我得到了:
^(([a-h]|[j-n]|p|[r-z]|[A-H]|[J-N]|P|[R-Z]|[0-9]){17})$
但是如果我只输入数字或只输入字母,那么正则表达式会将其验证为好。
答案 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);
说明
(?=.*[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
注意:不允许的字符也会满足需要字母的前瞻,但不允许字符的前瞻仍会停止。这样你就可以使表达式更简单。