1

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

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

但如果我只输入数字或字母,正则表达式会验证它是否良好。

4

2 回答 2

4

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

加上额外的空格和“注释”以提高可读性,正则表达式应如下所示:

^
(?=.*[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)
$
于 2013-03-14T13:47:01.060 回答
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

注意:需要字母的预读也会被不允许的字符满足,但不允许字符的预读仍然会阻止它。这样,您可以使表达式更简单。

于 2013-03-14T13:59:59.543 回答