2017-02-02 10 views
2

必ずしも連続していない文字が4文字以上含まれている文字列と一致する正規表現を作成しようとしています。正規表現で文字列の4文字を一致させる

入力文字列には、大文字と小文字、数字、アルファベット以外の文字を混在させることができますが、少なくとも4つの大文字または小文字が含まれている場合のみ、正規表現テストに合格します。

私は有効な入力になりたいものの例を以下に見られることができます。

a124Gh0st

を私は現在、正規表現のこの作品を書いた:

(?(?=[a-zA-Z])([a-zA-Z])|) 

をこれは5つのマッチを正常に返しますが、入力文字列に1文字以上ある限り、現在は常に合格となります。 {4、}を最後に追加すると、それは動作しますが、行内に4つの文字がある場合にのみ動作します。私は私がやっているかをテストするには、以下のWebサイトを使用しています

regex101

この上の任意の助けいただければ幸いです。

+1

あなたは、少なくとも4つの文字を含む文字列をマッチさせたいような音を書くかもしれません){4} 'または'(?s)^([^ a-zA-Z] * [A-Za-z]){4}。 –

+0

それは完璧です、私はあなたの2番目を使用しました:(?s)^([^ a-zA-Z] * [A-Za-z]){4}。応答。 – GradviusMars

答えて

2

あなたは

(?s)^([^a-zA-Z]*[A-Za-z]){4}.* 

または

^([^a-zA-Z]*[A-Za-z]){4}[\s\S]* 

を使用することがregex demoを参照してください。

詳細

  • ^ - 文字列の先頭
  • ([^a-zA-Z]*[A-Za-z]){4} - の正確4系列: -
  • [A-Za-z] ASCII文字以外の文字0+ -
    • [^a-zA-Z]* ASCII手紙
  • [\S\s]* - 任意の0以上の文字(DOTALL修飾子が有効な場合は.*と同じです)。
+0

ところで、上記の正規表現では、 '。*'を使用したときに発生する可能性のあるパフォーマンス上の問題を排除するために[コントラストの原則](http://www.rexegg.com/regex-style.html#contrast)または以下の答えのような '。*? '。明示的アンカリング(ここでは、 '^'は文字列の先頭でマッチをアンカーします)は、複数のマッチングアルゴリズムが存在し、文字列全体に対して正規表現を一度実行するだけでよい場合もあります。 '。*'/'[\ s \ S] *'はオプションで、正規表現を使って文字列をパターンに対してテストし、文字列の完全一致は必要ありません。 –

1

各文字の間に0個以上の文字を一致させるのはなぜですか?たとえば、

(?:[A-Za-z].*){4} 

あなたは[A-Za-z]を認識します。 .は任意の文字に一致するため、.*は、任意の文字の任意の数(ゼロを含む)の実行です。文字のグループの後に任意の数の文字が4回繰り返されるので、このパターンは、少なくとも4文字が文字列に現れる場合にのみ一致します。 (パターンの4番目のリピートの末尾にある.*は、ゼロ文字と一致する可能性があるため、ほとんど重要ではありません)。

不本意な量指定子をサポートする正規表現言語を使用している場合、それらを使用すると、このパターンはかなり効率的になります。たとえば、JavaやPerlで、一つは

(?:[A-Za-z].*?){4} 

.*?はまだ任意の文字の任意の数と一致して使用することを好むかもしれないが、マッチングアルゴリズムは、そのような各実行して、可能な限りいくつかの文字にマッチします。これにより、実行する必要があるバックトラッキングの量が削減されます。この特定のパターンでは、必要なバックトラックをゼロに減らします。

あなたの正規表現の方言で消極的数量をお持ちでない場合は、少しより冗長に同じ望ましい効果を達成することができます

あり
(?:[A-Za-z][^A-Za-z]*?){4} 

を、唯一の非文字が文字間の実行のために一致しています。

この場合でも、パターンはすべての正規表現フレーバ(非キャプチャグループ、列挙数量子)にはない正規表現フィーチャを使用しますが、これらは元の正規表現に存在します。 `^([^-ZA-Z] * [A-ZA-Z]:最大限の互換性フォームについて、あなたは

[A-Za-z][^A-Za-z]*[A-Za-z][^A-Za-z]*[A-Za-z][^A-Za-z]*[A-Za-z] 
+0

'(?:[A-Za-z]。*){4}'パターンは '[A-Za-z]'と同じ文字にマッチするので、余分なバックトラックを引き起こします。 –

+0

@WiktorStribiżew、確かにそうです。あなたがそのコメントをしていたとき、私は躊躇している数量子を利用できるようにするための勧告を書いていました。私は躊躇している量限定子に頼らない選択肢を瞬間的に加えるつもりです。 –

+0

["Contrast is Beautiful - それを使用してください"](http://www.rexegg.com/regex-style.html#contrast)レイジー/嫌な修飾語句もパフォーマンスに影響します。 –

関連する問題