2012-06-06 35 views
9

我試圖理解一段代碼,並且遇到了PHP的preg_replace函數中使用的正則表達式。正則表達式(?<! - )意味着什麼

'/(?<!-)color[^{:]*:[^{#]*$/i' 

這有點... (?<!-) 犯規出現在我的任何REG-EXP手冊。任何人都知道這意味着什麼? (谷歌不會回報任何東西 - 我不認爲符號在谷歌工作。)

+6

這是蝙蝠俠的敵人在左眼打的笑臉,但總是微笑......(但它會匹配任何戴類似帽子的人) –

+0

僅供參考:[環視聲明](http:// perldoc .perl.org/perlre.html#Look-Around-Assertions)在regular-expressions.info上的perlre,[Positive and Negative Lookbehind](http://www.regular-expressions.info/lookaround.html#lookbehind)。 – outis

回答

10

?<!在括號組的開始是negative lookbehind。它斷言color(嚴格來說,發動機中的c)前面沒有-字符。

因此,對於更具體的例子,它會在字符串匹配color

color 
+color 
someTextColor 

但它將無法在像-colorbackground-color。還要注意,引擎在技術上不會匹配c之前的任何內容,它只是斷言它不是連字符。這可能是一個重要的區別取決於上下文(illustrated on Rubular with a trivial example;請注意,只有最後一個字符串中的b匹配,而不是前面的字母)。

6

PHP使用Perl兼容的正則表達式(PCRE)作爲preg_ *函數。從perldoc perlre

"(?<!pattern)"
零寬度負向後看斷言。例如
"/(?<!bar)foo/"匹配任何發生的「富」
不遵循"bar"。僅適用於固定寬度的外觀 -
後面。

+0

你爲什麼不引用[PCRE](http://pcre.org/pcre.txt)? – Gumbo

+0

@Gumbo - 那會更好。我引用了perldoc,因爲我知道在哪裏可以找到信息。 – jordanm

4

我正在學習使用Python的re模塊的正則表達式!

http://docs.python.org/library/re.html

匹配,如果字符串中的當前位置不匹配的前面....這就是所謂的負向後斷言。與正向lookbehind斷言類似,所包含的模式只能匹配某些固定長度的字符串。以反向lookbehind斷言開頭的模式可能會匹配搜索字符串的開頭。

+1

Python正則表達式不像PHP那樣是PCRE。 – jordanm

+0

可以理解,我只是想指出另一個正則表達式庫,我是新來的正則表達式,所以我儘量學習大多數主要語言的正則表達式,所以我想我會指出Python的。 – richardhsu

相關問題