2016-11-01 7 views
0

私が先読みでチェックする5つの条件があるとしましょう。正規表現の条件の一部に一致する(3のうち3)

^(?=.*[a])(?=.*[b])(?=.*[c])(?=.*[d])(?=.*[e]).*$ 

regex101 - test

これは、B、C、D、Eの全ての順列と一致しますが、私はマッチさせたい:私はこれは私の正規表現になり

a, b, c, d, e 

それらを呼び出します。

0123:5のうち少なくとも3

意味これは通過する( 'HVD' などの排他的でないが指摘しました)

しかし、この意志はない

aaaaa 
bbbaaaaa 

EDIT: 本当の使用方法は、パスワードポリシーのためである - 5つの条件(小文字、大文字、特殊な文字、数、など)あなたが外にXを遵守しなければなりませんy条件。

これは簡単にコードで行われますが、これは正規表現の限界を押し上げる理論的な質問です。

+0

私はあなたに2つの選択肢があると思います:1)5または3のうちの3のすべての順列にマッチする)キャプチャグループのうちの3つにデータがある場合、一致をキャプチャしてチェックインします。 –

+0

"これはa、b、c、d、eのすべての順列と一致します" - 排他的ではありません。それはうれしいことに 'abcdef'のマッチを報告します。 – hvd

+0

あなたは 'OR'演算子でそれらを組み合わせることができます。もしあなたのフレーバーでサブルーチンがサポートされていれば、サブルーチンを使用してください。 – Jan

答えて

1

/^(?:(?=.*[a])(?:(?=.*[b])(?=.*(?:[c]|[d]|[e]))|(?=.*[c])(?=.*(?:[d]|[e])))|(?=.*[d])(?=.*[e])|(?=.*[b])(?:(?=.*[c])(?=.*[d])|(?=.*([c]|[d]))(?=.*[e]))|(?=.*[c])(?=.*[d])(?=.*[e])).*$/gm

これは、基本的に5つの可能なパターンのすべての順列を有する(ただし、符号長のビットを最適化)。

正常に動作することは確かではありませんが、正常に動作していますが、私はそれがかなりあると思います。 ^^

+0

私は結果を議論することはできません。努力だけのためにそれは受け入れられた答えに値する。編集:それは2つの条件を満たしているが、十分に近いにもかかわらず、 'de'にもマッチします。私は100%の正規表現は行く方法ではないと確信しています。 – Zikato

関連する問題