正規表現を使用するJSで、3文字のシーケンスを見つける方法、「abb」は有効ですが、「abbb」は有効ではありません(アルファベット、数字、および非英数字の可能性があります)。
この質問は、私がここで尋ねた質問のバリエーションです: Javascript のこれらの正規表現を組み合わせる方法。
これは間違っています :/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
では、それを行う正しい方法は何ですか?
正規表現を使用するJSで、3文字のシーケンスを見つける方法、「abb」は有効ですが、「abbb」は有効ではありません(アルファベット、数字、および非英数字の可能性があります)。
この質問は、私がここで尋ねた質問のバリエーションです: Javascript のこれらの正規表現を組み合わせる方法。
これは間違っています :/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
では、それを行う正しい方法は何ですか?
これは、実際に何を意味するかによって異なります。3 つの同一でない文字のみを照合する場合 (つまり、abb
が有効な場合)、次の否定先読みを使用できます。
(?!(.)\1\1).{3}
最初に、現在の位置の後に同じ文字が 3 回続いていないことをアサートします。次に、それらの 3 文字に一致します。
本当に 3 つの異なる文字 ( のようなもののみ) を一致させたい場合abc
は、もう少し複雑になります。代わりに、次の 2 つの否定先読みを使用します。
(.)(?!\1)(.)(?!\1|\2).
最初に 1 つの文字を一致させます。次に、 this の後に同じ文字が続かないことを主張します。その場合、別の文字と一致します。次に、これらの後に最初の文字も 2 番目の文字も続かないと主張します。次に、3 番目の文字を照合します。
これらの否定先読み ( (?!...)
) は文字を消費しないことに注意してください。そのため、それらは先読みと呼ばれます。彼らは次に来るもの (またはこの場合は次に来ないもの) をチェックするだけで、正規表現は残ったところから続行します。ここに良いチュートリアルがあります。
また、これは改行以外のすべてに一致することに注意してください。また、DOTALL またはSINGLELINEオプションを使用する場合は、実際にはすべてに一致します。JavaScript を使用しているため、正規表現の終了デリミタのs
後に追加することで、オプションを有効にすることができます。(何らかの理由で) このオプションを使用したくない場合は、.
s を[\s\S]
(これは常に任意の文字に一致します) に置き換えます。
アップデート:
コメントで明確にした後、 3 つの同一でない文字を検索するのではなく、文字列に3 つの同一の (かつ連続した) 文字が含まれていないことを主張したいことがわかりました。
これは、否定的な先読みが 1 つしか必要ないため、少し簡単で、以前の質問に近いものです。行うことは次のとおりです。文字列を先頭から 3 つの連続する同一文字を検索します。しかし、これらが存在しないことを主張したいので、これを否定先読みでラップします。
^(?!.*(.)\1\1)
先読みは文字列の先頭に固定されているため、これが唯一の場所です。次に、先読みのパターンは、文字列内の任意の位置から 3 つの同一の文字を見つけようとします ( .*
; のため、同一の文字は前の質問と同じ方法で照合されます)。パターンがこれらを検出した場合、否定先読みは失敗し、文字列は無効になります。同一の文字が 3 つ見つからない場合、内側のパターンは決して一致しないため、否定先読みは成功します。
3 つ以上の同一文字を見つけるには、正規表現パターンを使用します
([\s\S])(?!\1\1)[\s\S]{2}