正则表达式 (?<!-) 是啥意思

Posted

技术标签:

【中文标题】正则表达式 (?<!-) 是啥意思【英文标题】:what does the regular expression (?<!-) mean正则表达式 (?<!-) 是什么意思 【发布时间】:2012-06-10 22:55:44 【问题描述】:

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

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

这点...(?&lt;!-) 没有出现在我的任何 reg-exp 手册中。请问有人知道这是什么意思吗? (谷歌不返回任何东西——我认为符号在谷歌中不起作用。)

【问题讨论】:

这是蝙蝠侠的敌人左眼被击中的笑脸,但无论如何都在微笑……(但它会匹配任何戴类似帽子的人) 供参考:Look-Around Assertions from perlre,Positive and Negative Lookbehind on regular-expressions.info。 【参考方案1】:

括号组开头的?&lt;! 是negative lookbehind。它断言单词color(严格来说,引擎中的c)前面没有- 字符。

所以,举个更具体的例子,它会匹配字符串中的color

color
+color
someTextColor

但它会在 -colorbackground-color 之类的东西上失败。另请注意,引擎在技术上不会“匹配”c 之前的任何内容,它只是断言它不是连字符。这可能是一个重要的区别,具体取决于上下文(illustrated on Rubular with a trivial example;请注意,只有匹配最后一个字符串中的 b,而不是前面的字母)。

【讨论】:

【参考方案2】:

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

"(?&lt;!pattern)" 一个零宽度的否定后向断言。例如"/(?&lt;!bar)foo/" 匹配任何出现的“foo” 不关注"bar"。仅适用于固定宽度的外观- 后面。

【讨论】:

@Gumbo - 那样会更好。我引用了 perldoc,因为我确切地知道在哪里可以找到信息。【参考方案3】:

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

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

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

【讨论】:

Python 正则表达式不像 PHP 的 PCRE。 可以理解,我只是想指出另一个正则表达式库,我是正则表达式的新手,所以我试图尽可能多地学习大多数主要语言的正则表达式,所以我想我会指出 Python 的。

以上是关于正则表达式 (?<!-) 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

java 正则表达式 ^java 是啥意思

(?!a)0 是啥?在 Java 正则表达式中是啥意思?

js 正则表达式 \\-是啥意思

正则表达式 ^(\d1,2)$ 是啥意思? [复制]

java正则表达式中是啥意思

这个正则表达式是啥意思 - “\pLu”?