3

次の制約を持つ JavaScript 正規表現を作成する必要があります。

  • 入力文字列は 6 文字以上にする必要があります
  • 入力文字列には少なくとも 1 つのアルファベット文字が含まれている必要があります
  • 入力文字列には、アルファベット以外の文字が少なくとも 1 つ含まれている必要があります

JavaScript のルックバック機能が深刻に不足しています。私が思いついたこと:

((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)|
(.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)|
(..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))..)|
(...(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])).)|
(....(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])))

これはかなり長く見えます。より良い方法はありますか?

私がこれに来た方法:

  1. アルファベット文字の正規表現は[a-zA-Z]
  2. 非アルファベット文字の正規表現は[^a-zA-Z]
  3. [a-zA-Z][^a-zA-Z]だから私は aか[^a-zA-Z][a-zA-Z]
    そこらを探す必要があります(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))
  4. n 個の先行文字と 6 -n 個の後続文字をチェックする必要があります。
4

3 に答える 3

5
/^(?=.{6})(?=.*[a-zA-Z])(?=.*[^a-zA-Z])/

これの意味は:

^-文字列の開始
(?= ... )-その後に続く(つまり、独立したサブマッチ。現在の一致位置は移動しません)-6
.{6}文字(「文字列の開始に続いて6文字」は、「少なくとも6文字の長さである必要がある」ルールを実装します)
.*--0個以上の任意の文字(改行を除く-これを修正する必要がある場合がありますか?)
[a-zA-Z]-文字(.*[a-zA-Z]したがって、文字が含まれる文字列を検索します(技術的には最後の文字を検索します))
[^a-zA-Z]-文字以外の文字

要約:文字列の先頭から始めて、次のそれぞれを順番に一致させようとします。

  • 6文字(これらが見つかった場合、文字列は6文字(またはそれ以上)でなければなりません)
  • 任意の文字列とそれに続く文字
  • 任意の文字列とそれに続く非文字
于 2012-11-28T14:17:17.603 に答える
3

この正規表現を使用してください...

/^(?=.{6,})(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).*$/
  -------- ------------- --------------
    ^          ^              ^
    |          |              |->checks for a single non-alphabet
    |          |->checks for a single alphabet
    |->checks for 6 to many characters

(?=)一致zero widthチェックする先読みです。文字を消費しません。これが、複数の先読みを連続して使用できる理由です。

于 2012-11-28T14:17:26.630 に答える
0

他の人と同じように答えるので、これは多くの説明を必要としません、私は最善の方法はすることだと思います

/^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/

これは、文字列の先頭から始まり、アルファベット文字を先読みし、アルファベット以外の文字を先読みし、最後に6文字以上の文字列を見つけます。長さについて先読みする必要はないと思います。

于 2012-11-28T14:41:37.410 に答える