2011-01-21 10 views
2

正規表現に関する私の経験は限られています。私は否定と否定的な先読みなどのさまざまなチュートリアルや投稿を読んできましたが、

パスワードの複雑さのためにASP.NET MVC3に属性を作成しようとしています。検証の一部には、最小限の繰り返し文字数が含まれます。現在のプロジェクトでは限界は3ですが、私はそれを一般化したいと思います。"4つ以上の繰り返し文字が含まれていません"

最初は、@"(.)\1{3,}"を使用して、4つ以上の繰り返し文字をテストし、その結果を否定しました。 ModelClientValidationRegexRuleオブジェクトを作成する必要があるため、今はできません。肯定的な結果しか得られません。したがって、否定は正規表現自体の内部で行われなければならない。否定的な先読みを使用しようとするたびに失敗します。 @".*(?!(.)\1{3,})"

アイデア?

答えて

3

問題を回してください。文字には最大でも3文字まで続けてください。それから、別のものが続く必要があります。最後に、文字列全体はこのようなシーケンスで構成されていなければなりません。 Perlの味で:

^((.)\2{0,3}(?!\2))*$ 
+0

ありがとうございます。それはうまくいかないが、それは非常に近いようだ。私は、バット(非常に正規表現で経験の少ない)からそれを理解していないが、私は近くに見て、理解し、必要に応じて変更します。現在のところ、5文字以上の文字が4になると失敗します。私はそれを動作させるために自分で作業しています。 – jmcilhinney

+0

興味深いことに、単純なケースではここでうまくいくようです。あなたが何が間違っているのか分かったときにポストバックをしてください、私は興味があります:)とにかく、助けてうれしいです。 – abesto

2

あなたは.*内部の先読みを配置する必要があります。

(?!.*?(.)\1{3,}) 

あなたがそれをやっている方法を、.*は、文字列全体を消費し、その後、先読みがアサートの後ろに同じ文字が4つありません。の文字列の最後には、もちろん常に真です。

それがより適切なように見えたので、私は私の先読みで非欲張りスターを使用しますが、貪欲はあまりにも動作します - ちょうど内部先読みなければなりません。

これはいくつかの先読みの1つであると仮定しています。これは、正規表現のパスワード強度を検証する通常の手法です。ところで、正規表現否定が適切ですが、正規表現タグを使用した方が、より迅速に質問に回答することができました。

0

2度以上繰り返す文字がない8文字以上の場合は、単純^(.)(?!\1\1){8,}$を使用しました。

0

私はこの正規表現.*(.).*\1+.*を使用して、存在する繰り返し文字と一致すると思います。しかし、4つは、あなたに依存します。

幸運を祈る!

関連する問題