2

昨日、ユーザーが文字クラスを「任意の順序で」一致させようとしているという質問に答えました。 正規表現には「and」構造自体はありませんが、解決策を思いつきました(要約):

(?=[a-z])(?=\d)[a-z\d]{6,}

これはそのままでは機能しませんが、次のように変更します

(?=.*[a-z])(?=.*\d)[a-z\d]{6,}

動作します。先読みは何も消費しないため、このワイルドカード要件は少し奇妙に思えます。この式を一致させる必要があるのはなぜですか。.*たとえば、a1a1a1.

4

1 に答える 1

4

ワイルドカードが必要なのは、先読みが「ここ、前方」ではなく「どこでも」を意味できるようにするためです。

それがなければ、正規表現は次のようになります。

  • 次の条件が当てはまる文字列 (X と呼ぶ) のどこかを見つけます。
  • X の後の文字は文字です
  • X の後の文字も数字です
  • X の後に 6 文字以上の英数字がある

真ん中の 2 つは相互に排他的であるため (文字を文字と数字にすることはできません)、常に失敗します。

ただし、2番目の正規表現は次のように述べています。

  • 次の条件が当てはまる文字列 (X と呼ぶ) のどこかを見つけます。
  • 任意の数の文字の後に、文字があります
  • 任意の数の文字の後に数字があります
  • X の後に少なくとも 6 文字の英数字がある

うまくいけば、これは違いを説明します;)

于 2013-03-02T00:45:51.433 に答える