7

正規表現が (たとえば) 255 の最大長を超えることはできないことを示す属性を使用して、既存の正規表現を拡張するにはどうすればよいですか?

次の正規表現があります。

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

私はそのように試しましたが、失敗しました:

{.,255([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)}

4

4 に答える 4

12

これを行う最善の方法は、正規表現ベースのソリューションのみである必要がある場合、ルックアラウンドを使用することです。

この例を表示: http://regex101.com/r/yM3vL0

ここで行っているのは、最大3文字の長さの文字列のみを照合することです。確かに、私の例では、これは最善の方法ではありません。しかし、それは無視してください。私はあなたに役立つ例を示しているだけです。

また、パターンをアンカーする必要があります。そうしないと、エンジンはルックアラウンドを無視します (これについて詳しく説明する必要がありますか?)

つまり、正規表現で次を使用して、最大 255 文字に制限できます。

^(?!^.{256})([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

また、あなたの正規表現が悪いので、気分を害する必要があることを伝えるのが私の義務だと感じています。

于 2012-12-17T23:16:25.870 に答える
1

文字列の最大長もチェックしてみませんか?DataAnnotations を使用している場合は、プロパティに [StringLength(255)] を貼り付けることができます。

ASP.NET バリデーターを使用している場合は、RangeValidator を使用できます。

カスタム検証関数を使用している場合は、複雑な正規表現をスローする前に長さをチェックする方がはるかに読みやすく (かつ高速) です。

于 2012-12-18T01:00:33.090 に答える
1

正規表現は、実際にはすべての問題を解決するように作られているわけではありません。この場合、基になる表現で 255 の状態が必要になるため、長さ 255 のテストはコストがかかることをお勧めします。代わりに、文字列の長さを個別にテストしてください。

ただし、どうしても必要な場合は、文字をオプションにする必要があるため、次のようにします。

.?{255}

255 文字以下の任意の文字列に一致します。

于 2012-12-17T23:01:36.193 に答える
1

次のように先読みを使用できる場合があります。

^(?=.{0,255}$)your regex here$

そう...

^(?=^.{0,255}$)([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
于 2012-12-18T01:50:25.857 に答える