2

少なくとも 7 文字、20 文字を超えず、少なくとも 1 つの数字と少なくとも 1 つの文字を含む文字列に一致させる必要がある場合、この正規表現は正しいですか? 他に制約はありません。

[0-9]+[A-Za-z]+{7,20}

ありがとう

4

1 に答える 1

9

いいえ、ちがいます。量指定子{7,20}はトークンには適用されません (正規表現での繰り返しは、 、、またはより一般的なような量指定子で行われます。単一のトークン [この場合]で複数の量指定子を使用することはできません。それ自体が量指定子であり、したがって、上記のルールではプレイしません)。次のようなものが必要です。*+?{n,m}[a-zA-Z]*?

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

これには、少なくとも 1 つの数字と少なくとも 1 つの文字を確認する 2 つの先読みがあります。

(?=.*\d)
(?=.*[a-zA-Z])

ルックアラウンドはゼロ幅のアサーションです。文字列内の文字を消費しないため、単に位置を一致させているだけです。しかし、それらの内部の式が現在の時点で一致することを確認します。この場合、この式は任意の数の文字に一致し、それぞれ数字または文字が必要になります。

実際の試合自体、

.{7,20}

長さが合っていることを確認するだけです。上記の制約をすでに確認しているため、どの文字が使用されているかは関係ありません。

最後に、文字列の開始と文字列終了のアンカーが開始と終了に挿入されることで、式全体が固定されます。

^...$

これにより、一致が実際に文字列全体を網羅していることを確認できます。この場合、厳密には必要ではありませんが (すべての有効なケースでとにかく文字列全体に一致します)、通常、正規表現は部分文字列のみに一致し、これにより、失敗するはずの検証正規表現が一致するという微妙な問題が発生する可能性があるため、含めることをお勧めします。たとえば\d+、文字列が数字だけで構成されていることを確認するために を使用すると、a4b初心者をよく困惑させる文字列と一致します。

また、文字と数字の順序は関係ないと変更しました。あなたの正規表現は、すべての数字がすべての文字の前に来る必要がある明確な順序を課そうとしているように見えますが、これは通常、ここで必要なものではありません。

于 2012-06-27T09:07:15.437 に答える