2017-05-08 10 views
2

私は正規表現を練習しており、自分自身をテストするために、単純なパスワード検証式を作成しようとしていました。基本的には、それはそれは単純化のために(シンボルを持つことが必要複数のregex条件文をgiganic "または"文よりも検証する良い方法はありますか?

1)... [0-9A-Za-z]を受け入れるだろうが、私はそれが大文字

を持つために必要な

2))[#&@!&*%$]を使用しました私の考えでは、これを行う最善の方法は肯定的な先読みのステートメントであった。唯一の問題は、シンボルの前と後の検証でした。最初に大文字を先読みしていた場合、大文字が記号の前に来るかどうか、終りの場合は大文字であるかどうかだけを検証します。私がこれに対抗できる唯一の方法は、全体をコピーして大規模なORステートメントを作成することでしたが、先頭に先読みがあり、末尾に先読みがあります。私は(だけでなく、できれば皆さんに)私には意味をなさないの部分にそれを打破しようとするでしょう

/^[0-9A-Za-z#&@!&*%$]*(?=[A-Z]+)[0-9A-Za-z#&@!&*%$]*(?=[#&@!&*%$])[#&@!&*%$][A-Za-z|#&@!&*%$]*|[0-9A-Za-z#&@!&*%$]*(?=[#&@!&*%$])[#&@!&*%$](?=[A-Z]+)[0-9A-Za-z#&@!&*%$]*$/ 

:これは私が思いついた怪物です。それは私が首都があることを保証すること、そして、最初の肯定先読みが来る

  • で始まるものですので、ORステートメントの
      • 最初の部分は初めは、[0-9A-Za-z#&@!&*%$]*することができ[AZ]
      • 次に、[#&@!&*%$]のシンボルの1つが存在することを確認して、2番目の先読みが行われます。
      • 次に、それは、これらの必要なシンボルのいずれかが第1の部分が第2の部分は非常に最初のようなものです[A-Za-z|#&@!&*%$]*
    • OR書の第二部 の別の余裕をもって終わる
    • 次に来ることができます。まあ、ほぼ完全なコピーと貼り付け。私は| ORシンボルを置いていますが、(?=[A-Z]+)ルックアヘッドの代わりにのシンボルをの前に置いてチェックします。

    すべてでは、(ほとんどの場合、)機能するものに多大な努力を払っています。私はいくつかの広範なグーグルを行ったが、何も本当に私の質問に答えるように見えなかった。私がやりたいことについてもっと簡単に行く方法はありますか?あなたは、文字列の先頭に先読みを固定(一度だけそれらを実行するために)、どこでもライン上の検索を可能にするために先読みで必要なサブパターンの前.*.*?を追加(.は通常ないことに注意する必要がある

  • +0

    これはかなりの表現です!あなたの環境が許せば、私は '/ [A-Z] /'と '/ [#&@!&*%$] /'という複数の式に分けて、 – cxw

    +0

    私はこれがまったく問題ないと思う。したがって、 '[0-9A-Za-z#&@!&*%$] '文字の0以上の文字列にマッチする必要があります。大文字と' [#& !&*%$] 'どこにでも設定できますか? [このデモ](https://regex101.com/r/Gswowq/1)を参照してください。 –

    答えて

    3

    改行は一致しませんが、主なパターンは一致しません。したがって.で十分です)。

    だから、言った、あなたは

    ^(?=.*[A-Z])(?=.*[#&@!&*%$])[0-9A-Za-z#&@!&*%$]*$ 
    

    詳細を使用することがあります。

    • ^ - 文字列の先頭
    • (?=.*[A-Z]) - どこかに任意の0の後に大文字のASCII文字がなければなりません+改行以外の文字
    • (?=.*[#&@!&*%$]) - あります文字列の終わり - 定義された範囲または文字
    • $
    • から0+文字 - STはどこかにライン以外の任意の0+文字が
    • [0-9A-Za-z#&@!&*%$]*を壊した後、文字クラスから特殊な文字も。

    regex demoを参照してください。効率を上げるには、principle of contrastを使用してください:

    ^(?=[^A-Z]*[A-Z])(?=[^#&@!&*%$]*[#&@!&*%$])[0-9A-Za-z#&@!&*%$]*$ 
        ^^^^^^^   ^^^^^^^^^^^^ 
    
    +0

    ありがとうございました!それは本当に多くの助けになります。そして、私はコントラストの原則についてのリンクが非常に興味深いと感じました。私は、文字記号に一致するのではなく、[A - Z]の否定を使用することは決して考えなかったでしょう。私はどのようにそれを大きく最適化できるかを見ることができます。 – Schwaitz

    +0

    ええ、いくつかは時期尚早な最適化だと考えていますが、正規表現についての真実はあまり確かではないということです。むしろ常にベストプラクティスに従いたいと思います。 –

    関連する問題