2

正規表現を使用するJSで、3文字のシーケンスを見つける方法、「abb」は有効ですが、「abbb」は有効ではありません(アルファベット、数字、および非英数字の可能性があります)。

この質問は、私がここで尋ねた質問のバリエーションです: Javascript のこれらの正規表現を組み合わせる方法

これは間違っています :/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/では、それを行う正しい方法は何ですか?

4

2 に答える 2

6

これは、実際に何を意味するかによって異なります。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 つ見つからない場合、内側のパターンは決して一致しないため、否定先読みは成功します。

于 2012-10-27T15:27:16.950 に答える
0

3 つ以上の同一文字を見つけるには、正規表現パターンを使用します

([\s\S])(?!\1\1)[\s\S]{2}
于 2012-10-27T15:27:08.393 に答える