我试图理解一段代码,并遇到了 PHP 的 preg_replace 函数中使用的这个正则表达式。
'/(?<!-)color[^{:]*:[^{#]*$/i'
这一点……(?<!-)
没有出现在我的任何正则表达式手册中。请问有人知道这是什么意思吗?(谷歌不返回任何东西——我认为符号在谷歌中不起作用。)
我试图理解一段代码,并遇到了 PHP 的 preg_replace 函数中使用的这个正则表达式。
'/(?<!-)color[^{:]*:[^{#]*$/i'
这一点……(?<!-)
没有出现在我的任何正则表达式手册中。请问有人知道这是什么意思吗?(谷歌不返回任何东西——我认为符号在谷歌中不起作用。)
我试图理解一段代码,并遇到了 PHP 的 preg_replace 函数中使用的这个正则表达式。
'/(?<!-)color[^{:]*:[^{#]*$/i'
这一点……(?<!-)
没有出现在我的任何正则表达式手册中。请问有人知道这是什么意思吗?(谷歌不返回任何东西——我认为符号在谷歌中不起作用。)
?<!
括号组开头的 是否定的lookbehind。它断言这个词color
(严格来说,c
在引擎中)前面没有-
字符。
因此,对于更具体的示例,它将color
在字符串中匹配:
color
+color
someTextColor
但它会在类似的东西上失败-color
or background-color
。另请注意,引擎在技术上不会“匹配” 之前的任何内容c
,它只是断言它不是连字符。这可能是一个重要的区别,具体取决于上下文(在 Rubular 上用一个简单的示例进行了说明;请注意,只有b
最后一个字符串中的匹配,而不是前面的字母)。
?<!
括号组开头的 是否定的lookbehind。它断言这个词color
(严格来说,c
在引擎中)前面没有-
字符。
因此,对于更具体的示例,它将color
在字符串中匹配:
color
+color
someTextColor
但它会在类似的东西上失败-color
or background-color
。另请注意,引擎在技术上不会“匹配” 之前的任何内容c
,它只是断言它不是连字符。这可能是一个重要的区别,具体取决于上下文(在 Rubular 上用一个简单的示例进行了说明;请注意,只有b
最后一个字符串中的匹配,而不是前面的字母)。
PHP 对 preg_* 函数使用 perl 兼容的正则表达式 (PCRE)。来自perldoc perlre
:
"(?<!pattern)"
一个零宽度的否定后向断言。例如
"/(?<!bar)foo/"
匹配任何
不跟随的“foo”"bar"
。仅适用于固定宽度的
后视。
我正在使用 Python 的 re 模块学习正则表达式!
http://docs.python.org/library/re.html
如果字符串中的当前位置之前没有匹配 ...,则匹配。这称为否定后向断言。与肯定的后向断言类似,包含的模式必须只匹配一些固定长度的字符串。以否定后向断言开头的模式可能在被搜索的字符串的开头匹配。