17 文字を含み、必須の数字と文字が必要で、I、O、Q、Ñ の文字を含んではならない正規表現を作成しようとしています。現時点で私は持っています:
^(([a-h]|[j-n]|p|[r-z]|[A-H]|[J-N]|P|[R-Z]|[0-9]){17})$
しかし、数字のみまたは文字のみを入力すると、正規表現はそれを正しいものとして検証します。
17 文字を含み、必須の数字と文字が必要で、I、O、Q、Ñ の文字を含んではならない正規表現を作成しようとしています。現時点で私は持っています:
^(([a-h]|[j-n]|p|[r-z]|[A-H]|[J-N]|P|[R-Z]|[0-9]){17})$
しかし、数字のみまたは文字のみを入力すると、正規表現はそれを正しいものとして検証します。
一般に、このような場合、入力が追加の条件を満たすことをアサートするために、肯定的な先読みを使用する必要があります。ここには 2 つの条件があるため (少なくとも 1 つの数字を含む必要があり、少なくとも 1 つの文字を含む必要があります)、これは 2 つの異なる先読みに変換されます。
読みやすくするために余分な空白と「コメント」を追加すると、正規表現は次のようになります。
^
(?=.*[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)
$
肯定的および否定的な先読みを使用して、文字を要求および禁止します。
/^(?=.*[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
注: 文字を必要とする先読みは、許可されていない文字によっても満たされますが、その文字を許可しない先読みはそれを停止します。そうすることで、表現をよりシンプルにすることができます。