2016-02-17 25 views
5

私は次の文字列PCRE正規表現の重複一致

001110000100001100001 

と、この表現

/[1]....[1]/g 

を持って、これは2試合

matches

になりますが、私は、それはまた、一致させたいです両者の間のパターンは、見えるように言えば、重なり合っている1

私は全くの手掛かりがありません。どうすればこのことができますか? 0の代わりに任意の文字を指定できます。

+0

'/(パターン)(。*?)\ 1 /'これを使用して、取得した2番目のグループ値を取得します。 lookbehindの必要はありません。 – Tushar

+0

フルマッチが必要な場合は、[(?:(?<= 1).... 1)+](https://regex101.com/r/rN2uV2/1)を試してください –

答えて

5

一般的なやり方は、アンカリングされたポジティブ先読みの中にキャプチャ技術を使用することです。 preg_match_allと、この正規表現を使用します。

(?=(1....1)) 

regex demo

values are in $matches[1]を参照してください:

$re = "/(?=(1....1))/"; 
$str = "001110000100001100001"; 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); 

lookahead referenceを参照してください:

前後参照は、実際の文字に一致しますが、その後、試合を放棄結果のみを返す:マッチするかマッチしないかch。それが「アサーション」と呼ばれる理由です。彼らは文字列内の文字を消費しませんが、一致が可能かどうかだけをアサートします。 (?=(regex))

あなたが先読み内部の正規表現のマッチを保存したい場合は、に持っているが、このように、先読み内部の正規表現の周りにキャプチャ括弧を置きます。

+1

ありがとう、私はすでに肯定的な先読みでarroundを演奏していますが、これは正しいことではありません。 –