2012-02-12 9 views
2

私は背後を見る正規表現が必要だと思います。Regexは、行がコメントデリミタで始まらない場合にのみ値を一致させます

:私は「これは」文字列である限り、それは「//」

後に来ないように、例えば、それは、これが文字列だった場合は、「この」にマッチするマッチする正規表現をしたいです

私はそれがあった

ではなく、場合、私の例としてこれを使用しています:

//私は私の例として、これを使用してい

+2

[何を試しましたか](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

+0

コメントアウトされたコードを解析しますか? –

+0

//(?= this)は、これに続く//と一致します http://www.regular-expressions.info/lookaround.html – Joel

答えて

1

これは、lookbehindが仕事の明白なツールのように見えるが、使用できない多くの状況の1つです。主な問題は、後読みの部分式が?*+、または{min,max}のような数量詞を使用することはできませんので、これは動作しませんということです。ほとんどの正規表現のフレーバーで

preg_match('~(?<!//.*)\bthis\b~', $subject, $match); // nope! 

あなたと行全体にマッチしなければなりませんあなたが探しているトークンの前のどこかに//が現れない正規表現です。 @Gumboはそれを行う一つの方法を示し、ここでは別です:

preg_match('~^(?:(?!//).)*\bthis\b~', $subject, $match); 

あなたの目標は、他にトークンを交換する場合 - たとえば、thatthisを交換する前に、ものをキャプチャする必要があり--you'llそれと後ろにそれをプラグイン:しかし、PHPは別のオプション提供しています

preg_replace('~^((?:(?!//).)*)\bthis\b~', '$1that', $subject); 

\Kを、マッチポイントは、オペレータのリセット(または私はそれを呼び出すために好きなように、「貧者の後方参照」)。

preg_match('~^(?:(?!//).)*\K\bthis\b~', $subject, $match); 

あなたは、通常の方法で、先行する事柄と一致しますが、\Kに正規表現エンジンを告げる試合は本当にただ\bthis\b前に、ではない文字列の先頭に開始し、その$match[0]の値をふり単純に"this"です。

Perlの正規表現の風味に由来
preg_replace('~^(?:(?!//).)*\K\bthis\b~', 'that', $subject); 

\K:あなたは置き換えをやっている場合は、前述の問題をキャプチャし、後ろにそれをプラグインする必要はありません。

2

この正規表現は、それを行う必要があります。

^([^/]|/(?!/))*this 

([^/]|/(?!/))*試合//が含まれていない任意のシーケンスを。

関連する問題