2017-07-04 3 views
1

とルールの組み合わせ、IMユーザが入力したパスワードを検証しようとすると、それはいくつかのルールにアンドロイドプロジェクトで正規表現

に従わなければならないルールは、次のとおりです。 それは7つの文字と、以下の条件の3を持っている必要があります

**

-One小文字

-One大文字

-One例えば特殊文字

**

-One:

asd123!

PPPppp000

TTT999 ###

私はこの正規表現

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#[email protected]$%^&*-]).{7,}+$ 

をしようとしていたが、これは同時に、すべてのルールを適用します。

+0

正規表現には何が必要ですか?あなたの入力を検証したい場合は、すべての文字を繰り返して基準をチェックしてください。 – pskink

+0

"次の4つの条件のうちの3つ"が迷惑になるでしょう:可能な組み合わせを説明するために交互に使用する必要があります – Aaron

+0

@pskink、実際の必要性、私はそれが可能だったかどうか疑問に思っていた。 – Ric

答えて

3

ここでのアプローチは間違っています。あなたが作成した正規表現は、ベッドの下からモンスターのように見え、誰かが正規表現を学んでいても、読みにくいです。

正規表現を4つ(または規則がある限り)に分割し、3つの正規表現が一致を返すかどうかをチェックしてみませんか?あなたはあなたの正規表現をよりきれいにするだけでなく、正規表現全体を変更する必要がなければ、さらにルールを追加することができます。

(Android開発キットの該当する場合)チェック用に組み込みメソッドを使用することもできます。

いくつかの擬似コードは次のようになります。

result1 = Regex.IsMatch(password, rule1regex) 
result2 = Regex.IsMatch(password, rule2regex) 
... 
resultN = Regex.IsMatch(password, rule3regex) 

if(three_out_of_four_rules_apply) 
    password_valid = true 

あなたはまた、@pskinkのコメントで提案された方法を適用し、パスワードの各文字を反復し、それに応じて出力を設定することができます。

+0

私は同意する、私のアプローチは間違っていた – Ric

+0

ちょうどsidenote - 質問は悪くないです。それは正当な質問を維持する価値があり、@アロンが与えた答えも良いです(私のupvote、アーロンを持って:))。これは単に純粋な正規表現で(可能ではあるが)過剰なものです。 – Asunez

2

(正しいように見える)あなたの先読みの詳細に入るがなければ、ここであなたは純粋な正規表現では「4つの基準のうち3」を実装する必要があります方法は次のとおりです。

(?=.*A)(?=.*B)(?=.*C)|(?=.*A)(?=.*B)(?=.*D)|(?=.*A)(?=.*C)(?=.*D)|(?=.*B)(?=.*C)(?=.*D) 

あなたはそれをhereテストすることができます。

因数分解は実際にそれが良いことはありません。

(?=.*A)(?:(?=.*B)(?=.*(?:C|D))|(?=.*C)(?=.*D))|(?=.*B)(?=.*C)(?=.*D) 

私は明らかに制約のこれらの種類を実装するために、より高いレベルの言語を使用することをお勧めします。

+0

私は@Asunezの答えを受け入れました。それは意味がありましたが、助けてくれてありがとうございます。 – Ric

+0

@Ric確かに、私はあなたがこのコードを実際に使用していないことを安心しています;) – Aaron