2016-10-06 7 views
2

私は物事が実際に先読みでどのように実際に働くかを把握しようとしています。私はABCとPQRの間のどこかに「mao」を含んでいる ABCとPQRの間に何かを取り込もうとしています。ポジティブルックアヘッドを使用している間に不一致があります

物事はそれで作業しているようだ:

ABC(?=.*?mao).*?PQR 

それが一つの場合を除いて細かいマッチングされ、そのために私のスクリーンショットを見る:

enter image description here

私は赤がブロックshouldnをマーク思いましたマッチしました。

I have tried it here

誰もが私がここで間違ってやっていると、なぜそれが一致しているかを説明していただけますか?

答えて

1

(?=.*?mao)PQR.ためのマッチ任意の文字(DOTALLモードがONでない場合は、すべての改行記号を除く)後maoを見つけることができます。 では、PQRと同じ行の改行記号以外の0以上の文字の後にmaoが表示されるため、先読みでが返されます。が返されます。

ことを避けるためには、使用tempered greedy token

ABC(?=(?:(?!PQR).)*mao).*?PQR 
     ^^^^^^^^^^^^^ 

this demoは(あなたもちょうどそれが怠惰になりますではなく**?を使用することができる)を参照してください。

(?=(?:(?!PQR).)*mao)構築物は、唯一の(PQRmaoの前に表示されない場合には、ある)PQR文字シーケンスを開始していない0+文字の後にmao場合に表示されますが返されます。

+0

PQR後に "(?=。*?mao)"がマオを見つけることができる理由を少し教えてください。 –

+0

"maoが内部に入っているzxcABCdddddddPQRaasdでは、maoはPQRと同じ行の改行記号以外の0以上の文字の後に表示されるため、lookaheadはtrueを返します。 ---私は境界PQRを設定しました。これはなぜそれを超えているのですか?コンセプトに問題があると思います。 –

+0

はい、 '。*?mao'の説明は'。*? 'はlinebreak以外の0個以上の文字にマッチします可能な限り少ないが、有効なマッチを返すために必要な数だけ、最初の 'mao 'まで。 –

1

「ABCとPQRの間のどこかに「mao」が含まれているABCとPQRの間をキャプチャしたい場合は、先読みに.*を含める必要はありません。ただ、使用:

ABC.*(?=mao).*PQR 

Test yourself

編集:私のああ、それは少し早いです - 質問に与えられたとして、すべてで先読みを使用するために必要ではないです、あなたの要件を満たすために。これは十分にある。もちろん

ABC.*mao.*PQR 

これは、それはあなたがあまりにもそれを好むだろうと多くを一致させるかもしれないABCandABCmaoPQRABCmaoPQRmaoPQRのようにスタート(ABC)とend(PQR)トークンを、再び登場に問題があります。 I've updated the regex here to include these sample cases

編集2:あなたのテスト文字列ABC1234sakasdf mao mao aslkdfPQR dsfgasd mao maoPQRのいずれかが既に上記の段落で説明した内容をカバーしていることがわかりました。私はコーヒーが必要です。

+0

'ABC。*(?= mao)。* PQR'正規表現は、その前に' mao'を持つ最後の 'PQR'まで一致するのでOP正規表現と同じように動作しません。 'ABC。*?mao。*?PQR'に変更すると、それはより近くなりますが、' ABC 1 PQR mao aslkdf PQR'にもマッチします。 –

関連する問題