0

誰かが以下の正規表現を説明できますか?これは私が参加する前から非常に長い間私のアプリケーションで使用されており、私は正規表現に非常に慣れていません。

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

私が理解する限りでは

この正規表現は、最小6文字から最大10文字まで、^や$などの文字をエスケープすることを検証します。

また、私の基本的なニーズは、1文字が数字で、もう1文字が特殊文字である6文字以上の正規表現が必要なことです。

4

4 に答える 4

7
^.*(?=.{6,10})(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])(?=.*\d.*\d).*$
  • ^「アンカー」と呼ばれます。これは基本的に、後続のテキストは「入力の開始」の直後でなければならないことを意味します。したがって^B、2番目の「B」は最初の文字ではないため、「B」と一致しますが、「AB」とは一致しません。

  • .*0個以上の文字に一致します-改行以外の任意の文字(デフォルト)。これは、貪欲な数量詞として知られているものです。正規表現エンジンは、すべての文字を入力の最後(または行の終わり)に一致させ(「消費」)、その後、式の残りの部分を逆方向に処理します(「必要な場合にのみ」文字を放棄します)。正規表現では、文字が「一致」すると、式の他の部分はそれを再び「一致」できなくなります(次に来るゼロ幅ルックアラウンドを除く)。

  • (?=.{6,10})は先読みアンカーであり、入力の位置と一致します。入力内で6〜10文字が続く場所を見つけますが、それらの文字を「消費」しません。つまり、次の式は自由に一致します。

  • (?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])もう1つの先読みアンカーです。これは、次のテキストに4文字が含まれる(1つの小文字または大文字に一致する)入力内の位置に一致しますが、他の任意の数の文字(0文字を含む)がそれらの間にある場合があります。[a-zA-Z]例:「++ a5b --- C@D」は一致します。繰り返しになりますが、アンカーであるため、一致した文字を実際に「消費」することはありません。テキスト内で、の文字が式と一致する位置のみを検索します。

  • (?=.*\d.*\d)別の先読み。これは、2つの数字が続く位置に一致します(間に他の任意の数の文字があります)。

  • .*すでにこれをカバーしました。

  • $これは、入力の終わり(または行の終わり-改行文字の直前の位置)に一致する別の種類のアンカーです。これは、前の式が文字列の最後の文字と一致する必要があることを示しています。^とを一緒に使用する場合$は、入力全体(一部だけでなく)を一致させる必要があることを意味します。したがって/bcd/、「abcde」と一致し/^bcd$/ますが、「a」と「e」を一致に含めることができなかったため、「abcde」とは一致しません。

ノート

これは、パスワード検証の正規表現のように見えます。もしそうなら、それが壊れていることに注意してください。最初と最後の.*atを使用すると、パスワードを任意に10文字より長くすることができます。少し短くするように書き直すこともできます。私は、以下が許容できる(そして少し読みやすい)代替品になると信じています:

^(?=(.*[a-zA-Z]){4})(?=(.*\d){2}).{6,10}$

文字の長さの制限を実装する正しい方法を指摘してくれた@nhahtdhに感謝します。

于 2013-01-17T17:25:01.023 に答える
2

構文の説明については、Cyborgx37の回答を確認してください。正規表現の意味について説明します。

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

最初のアサーションは冗長です。残りは任意の文字で.*始まり、最後にゼロ幅のアサーションであるためです。..*

アサーションにより、正規表現は最低6文字に一致し(?=.{6,10})ます。ただし、正規表現が一致できる文字列の文字数に上限はありません。これは.*最後にあるためです(.*前のも貢献します)。

この(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])部分は、少なくとも4つの英語のアルファベット文字(大文字または小文字)があることを示しています。そして(?=.*\d.*\d)、少なくとも2桁の数字(0-9)があることを表明します。[a-zA-Z]とは互いに素な集合であるため\d、これら2つの条件を組み合わせると(?=.{6,10})冗長になります。

の構文.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z]も不必要に冗長です。繰り返しを使用すると短縮できます(?:.*[a-zA-Z]){4}

次の正規表現は、元の正規表現と同等です。しかし、私はあなたの現在のものを本当に疑っています、そしてあなたの正規表現のこの同等の書き直しはあなたが望むことをします:

^(?=(?:.*[a-zA-Z]){4})(?=(?:.*\d){2}).*$

明快さは常に優れているので、長さをより明確にします。意味は同じままです:

^(?=(?:.*[a-zA-Z]){4})(?=(?:.*\d){2}).{6,}$

要約

  • 最小の長さ=6
  • 最大長に制限はありません
  • 少なくとも4つの英語のアルファベット、小文字または大文字
  • 少なくとも2桁0-9
于 2013-01-17T17:45:32.177 に答える
0

再説明

  • /.../:スラッシュは、正規表現が定義されている領域を表すためによく使用されます

  • ^:入力文字列の先頭に一致します

  • .:これはどの文字にも一致します

  • *:前の記号と0回以上一致する

  • .{6,10}.:6〜10回のどこかで(任意の文字)に一致します

  • [a-zA-Z]:との間aおよびzとの間のすべての文字に一致しますAZ

  • \d:数字に一致します。

  • $:入力の終わりに一致します。

投稿した正規表現のすべてのシンボルについては、ほぼ同じだと思います。

于 2013-01-17T17:23:53.533 に答える
0

正規表現のリクエストには、次のように使用します。

^(?=.{6,}$)(?=.*?\d)(?=.*?[!@#$%&*()+_=?\^-]).*

そして、ここでそれはあなたのために展開されます:

^          // Anchor the beginning of the string (password).

(?=.{6,}$) // Look ahead: Six or more characters, then the end of the string.

(?=.*?\d)  // Look ahead: Anything, then a single digit.

(?=.*?[!@#$%&*()+_=?\^-]) // Look ahead: Anything, and a special character.

.*         // Passes our look aheads, let's consume the entire string.

ご覧のとおり、特殊文字には予約済みの省略表記(、、など)がないため、特殊文字を明示的に定義する必要が\wあり\sます\d。受け入れられたものは次のとおりです(必要に応じて変更できます)。

!, @, #, $, %, ^, &, *, (, ), -, +, _, =, ?

正規表現の先読みを理解するための鍵は、正規表現がパーサーの位置を動かさないことを覚えておくことです。(?=...)これは、最後のパターンマッチの後に最初の文字を見始めることを意味し、その後の(?=...)先読みも同様です。

于 2013-01-17T17:51:53.073 に答える