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

一般に、このような場合、入力が追加の条件を満たすことをアサートするために、肯定的な先読みを使用する必要があります。ここには 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)
$
于 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 に答える