2013-10-03 19 views
5

私はRegexには新しく、学校で学んだばかりです。私は最初の譲渡を受け、それをかなりうまく使いこなしています。パスワードの最小/最大の長さを確認してください

私のコードが意味をなすように説明してください... 割り当てによって、.NET Regex Testerでパスワード用のテキストが検索されています。 これらのパスワードは、数字またはアンダースコアで始めることはできません任意の空白を(私は\S使用)を含めることはできませんので、私は二つの異なる文字

(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>) 

に少なくとも一つが含まれている必要はあり終了することはできません (?m:^([^_|^0-9]{1}) を使用しました私は先読みを使いました。 ここにあるのは、コードは今はかなり混乱していることです。

(?=.*\d)(?m:^([^_|^0-9]{1})(\S*)(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>)) 

もう1つ追加する必要があります。パスワードは8〜20文字の長さでなければなりません。 私は{8,20}(私は思う)を使用しなければならないことを知っていますが、事実は、私がこれを入力しても、それは完全に検索を殺します。

誰も私がこれをどのように解決できるか考えていますか?

非常に高く評価されています。以下について

答えて

1

[免責事項は、それはかなり長い答えだ!]

私は文字制限で始まります。

あなたは、パスワードの始まりと終わりを示し、実際のパスワードに\S{8,20}を使用する(?<!\S)(?!\S)を使用する必要があります:

(?m)(?<!\S)\S{8,20}(?!\S) 

あなたはおそらくすでに(?m)は、複数行のために(^$である知っているようにこのモードでは文字列の代わりにそれぞれ行の先頭と末尾に一致します)。

(?<!\S)は、パスワードの前に空白文字がないことを確認します。

(?!\S)は、パスワードの後に​​空白文字がないことを確認します。

今、我々はいくつかの制限を追加:

は数字で始まるか、アンダースコアができません:(?![0-9_])パスワードの開始時に否定先読みを:(?=\S+[0-9])肯定先読み:

(?m)(?<!\S)(?![0-9_])\S{8,20}(?!\S) 

は、少なくとも一つの数字が含まれている必要がありますパスワードの冒頭に:

(?m)(?<!\S)(?![0-9_])(?=\S+[0-9])\S{8,20}(?!\S) 

同じ文字で終了する必要があります:あなたは秒をキャプチャする必要がありますdを最後の文字にして逆参照を使用します。あなたはこのために\S{6,18}(\S)\1\S{8,20}一部を変更することができます。

(?m)(?<!\S)(?![0-9_])(?=\S+[0-9])\S{6,18}(\S)\1(?!\S) 

今それは良いことがあります。今、あなたの正規表現に


(?m:^([^_|^0-9]{1}) 

まず、あなたがそれを削除した場合、それがすべてでは何も変わりませんので、{1}冗長です。

(?m:^([^_|^0-9]) 

次に、アンバランスな括弧があります。それが何であるかはっきりしていませんが、私は最初のparenが意図されていなかったと思います。

(?m:^[^_|^0-9]) 

次に、文字クラス[^_|^0-9]_|^または範囲0-9以外の任意の文字に一致します。私は、パスワードはまたは^で始まるで始まると確信しています。メタキャラクター|は、文字クラスでその意味を失います!代わりに[^_0-9]これはなる:あなたはこれを使用することができ

(?m:^[^_0-9]) 

それは、これを使用しても大丈夫ですが、あなたは、これは、パスワードの最初の文字であることを心に留めておく必要があります。あなたは8〜20文字の範囲を尊重しており、それはちょうど7,19に変更されています。そこに残されている唯一のことは、スペースも受け入れるということです。

(?<finalTwo>(?i:\S{1}))(?i:\<finalTwo>) 

まず非キャプチャグループで、大丈夫、という名前のキャプチャグループです:次のいずれかが、

(?m:^[^_0-9 ]) 

さて、良く見える:あなたはこれを回避するために、文字クラスで1を置くことができます正規表現にアルファベットがないので大文字小文字の非感受性モードがオンになり、非キャプチャグループに\S{1}が含まれます。再び、{1}は冗長です。それと(?i)モードを削除し、これは次のようになります。それは、最後の2つの文字に一致した場合、それは実際に働くだろう、そう悪くはない

(?<finalTwo>\S)(?:\<finalTwo>) 

を。

(?=.*\d) 

よく機能します。 0-9以外の文字が一致することがわかるかもしれませんが、気にしない場合はほぼ同じです。 2つのパスワードがテキストの隣にスペースで区切られていると、意図した通りに行かなくなる可能性があるので、の代わりに.を使用する方が良いでしょう。

(\S*) 

その部分は多かれ少なかれ大丈夫です。制限はありません。

(?=\S*\d)(?m:^[^_0-9 ])(\S*)(?<finalTwo>\S)(?:\<finalTwo>) 

今、(?m:^[^_0-9])は一つの文字を取って、(?<finalTwo>\S)(?:\<finalTwo>)は、2つの文字を取り、3の合計のためにあなたは、このように課す制限があることを覚えて、オーケー:

(?=\S*\d)(?m:^[^_0-9 ])(\S{5,17})(?<finalTwo>\S)(?:\<finalTwo>) 

それはほとんど機能し、そしてあなたより長いパスワードの部分一致を防ぐために何かを置く必要があるだけです。通常は単語境界\bを使用できますが、シンボルについては何も言及されていないので、[email protected]*&AUn++のようなパスワードも許可されていると仮定することは安全です。だから私は否定的なルアラウンドの使用を提案しています。

0

方法:

^(?!^[^0-9]+$)[^0-9_].{5,17}(.)\1$ 

^:START-OF-文字列。

(?!^[^0-9]+$):パスワードが数字以外の文字の組み合わせではないことを確認して数字があることを確認してください。

[^0-9_]:数字またはアンダースコアでないもので始まっていることを確認してください。

.{5,17}:5〜17文字のいずれかに一致します。

(.):ちょうど最後の前の文字にマッチし、グループ1

\1でそれをキャプチャ:最後の文字はその前のものと同じであることを確認してください。

$:End-of-string。

[^0-9_](.)\1が最大3つの文字を取り、これは20文字の合計最大になり上限として.{5,17}及び最小境界としてしたがって5、ひいては17の最小値として5つの文字を残します。

Regex101 Demo

私はデモがPHPを使用しています知っているが、それは本当にここに重要ではありません。

関連する問題