2017-01-09 20 views
3

繰り返される単一の文字のパターンに一致するq正規表現を作成したいと思います。 たとえば、同じ文字「A」の3倍の後に、別の文字「B」の2倍が続きます。 2番目のグループの文字が2回以上繰り返されても問題はありません。 は、例えば、それは私が次の正規表現を作ってみた文字列wuzDDDFFFxji最初のグループの1文字を2番目のグループにマッチさせないようにする方法は?

Full match 3-8 `DDDFF` 
Group 1. 3-4 `D` 
Group 2. 6-7 `F` 

と一致する必要がありますが、1つの制限があります。

(.)\1{2}(.)\2{1} 

それはほとんど動作しますが、それは第二のグループにマッチしているから、最初のグループの文字を除外しません。これは私が望むものと一致していませんが、私は別のものにマッチしているから特定のグループを除外するための正しい構文を見つけることができませんでした

Full match 5-10 `QQQQQ` 
Group 1. 5-6 `Q` 
Group 2. 8-9 `Q` 

:文字列qwuiuQQQQQsasは以来マッチします。私の最も近い試みはここ

(.)\1{2}((?:\1))\2{1} 


1st Capturing Group (.) 
. matches any character (except for line terminators) 
\1{2} matches the same text as most recently matched by the 1st capturing group 
{2} Quantifier — Matches exactly 2 times 
2nd Capturing Group ((?:\1)) 
Non-capturing group (?:\1) 
\1 matches the same text as most recently matched by the 1st capturing group 
\2{1} matches the same text as most recently matched by the 2nd capturing group 
{1} Quantifier — Matches exactly one time (meaningless quantifier) 

どれでもヒントを動作するようには思えないのですか?どうもありがとうございます!

+0

正規表現のフレーバー/プログラミング言語/ツールは何を?なぜ最後のパターンは機能しないのですか? –

+0

'qwuiuQQQQQsasで何もマッチしないようにするには、' '(。)\ 1 {2}((?!\ 1)。)\ 2'](https://regex101.com/r/rjRNik/1) ' –

答えて

3

qwuiuQQQQQsasにマッチするのを避けることは、あなたは非キャプチャグループではなく、負の先読みを使用する必要があります。

(.)\1{2}((?!\1).)\2 
     ^^^^^^ 

the regex demoを参照してください。

(?!\1)否定先読みは

非キャプチャグループは、任意のパターンを制限しないが、それでもちょうどグループのサブパターンに使用されているグループ1にマッチしたもの以外の唯一の一致文字に.パターンを「制限」されますテキストを消費し、先読み(ゼロ幅アサーション)はテキストを消費せず、パターンに一致するテキストが文字列内に存在するかどうかのみをチェックします。

+0

動作するようです!私はこれほど遠くはなかった。 Btw、私を困惑させるものがあります。 Btw、私はn回同じ文字が必要なので、なぜグループへの参照の後に{n-1}を書かなければならないのですか?捕獲はすでに一度それ自体のために数えているようだ。 – tbop

+1

charを '()'の中にある '.'でマッチさせます。だから、 '\ 1 {2}'を追加した後に2つのより多くの同一の文字を合計3つ取り込みます。グループはテキストを消費し、ルックアヘッド(lookbehind、lookaheads)とその他のゼロ幅アサーション(単語境界、アンカー)はテキストを消費しません。 –

2

私は "\ 1 \ 1が続いていません" パターン使用することをお勧めします:

(.)\1+(?!\1)(.)\2+ 

デモ:https://regex101.com/r/QkqpzS/1

関連する問題