これは、正規表現の方法を支持するのではなく、可能性を実証するためのものです。他の健全な解決策を検討してください。
最初のステップとして、使用可能な文字数を数えます。
次に、正規表現をそのように構築します (これは Perl コードではありません! ):
入力アンカーの先頭から開始します。これは、文字列の先頭 (リストからの 1 つの単語) と一致します。
^
これらを一意の文字の数だけ追加します。
(?!(?:[^<char>]*+<char>){<count + 1>})
例:(?!(?:[^a]*+a){3})
の数a
が 2 の場合。
ここでは、 zero-width negative look-ahead と呼ばれる高度な正規表現構造を使用しました(?!pattern)
。テキストを消費せず、指定されたパターンと一致する文字列が先にないことを確認するために最善を尽くします(?:[^a]*+a){3}
。基本的には、文字列で 3 'a' が先に見つからないことを確認するという考え方です。本当に「a」が 3 つ見つからない場合は、文字列に含まれる「a」が 2 つ以下であることを意味します。
*+
0 以上の量指定子である を所有格として使用していることに注意してください。これは、不要な後戻りを避けるためです。
内に表示できる文字を入力してください[]
:
[<unique_chars_in_list>]+
例: の場合a b c d a e f g
、 になり[abcdefg]+
ます。この部分は実際に文字列を消費し、文字列にリスト内の文字のみが含まれていることを確認します。
文字列の末尾に一致する入力アンカーの末尾で終了します。
$
したがって、あなたの例では、正規表現は次のようになります。
^(?!(?:[^a]*+a){3})(?!(?:[^b]*+b){2})(?!(?:[^c]*+c){2})(?!(?:[^d]*+d){2})(?!(?:[^e]*+e){2})(?!(?:[^f]*+f){2})(?!(?:[^g]*+g){2})[abcdefg]+$
i
大文字と小文字を区別しない一致のフラグも指定する必要があります。
これは、一致する単語のリストで英語のアルファベット (az) のケースのみを考慮することに注意してください。スペースとハイフンは (まだ) ここでは考慮されていません。