9

我试图理解一段代码,并遇到了 PHP 的 preg_replace 函数中使用的这个正则表达式。

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

这一点……(?<!-) 没有出现在我的任何正则表达式手册中。请问有人知道这是什么意思吗?(谷歌不返回任何东西——我认为符号在谷歌中不起作用。)


?<!括号组开头的 是否定的lookbehind。它断言这个词color(严格来说,c在引擎中)前面没有-字符。

因此,对于更具体的示例,它将color在字符串中匹配:

color
+color
someTextColor

但它会在类似的东西上失败-coloror background-color。另请注意,引擎在技术上不会“匹配” 之前的任何内容c,它只是断言它不是连字符。这可能是一个重要的区别,具体取决于上下文(在 Rubular 上用一个简单的示例进行了说明;请注意,只有b最后一个字符串中的匹配,而不是前面的字母)。

4

3 回答 3

10

?<!括号组开头的 是否定的lookbehind。它断言这个词color(严格来说,c在引擎中)前面没有-字符。

因此,对于更具体的示例,它将color在字符串中匹配:

color
+color
someTextColor

但它会在类似的东西上失败-coloror background-color。另请注意,引擎在技术上不会“匹配” 之前的任何内容c,它只是断言它不是连字符。这可能是一个重要的区别,具体取决于上下文(在 Rubular 上用一个简单的示例进行了说明;请注意,只有b最后一个字符串中的匹配,而不是前面的字母)。

于 2012-06-06T21:23:25.170 回答
6

PHP 对 preg_* 函数使用 perl 兼容的正则表达式 (PCRE)。来自perldoc perlre

"(?<!pattern)"
一个零宽度的否定后向断言。例如
"/(?<!bar)foo/"匹配任何
不跟随的“foo” "bar"。仅适用于固定宽度的
后视。

于 2012-06-06T21:25:03.850 回答
4

我正在使用 Python 的 re 模块学习正则表达式!

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

如果字符串中的当前位置之前没有匹配 ...,则匹配。这称为否定后向断言。与肯定的后向断言类似,包含的模式必须只匹配一些固定长度的字符串。以否定后向断言开头的模式可能在被搜索的字符串的开头匹配。

于 2012-06-06T21:27:59.010 回答