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

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

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

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

【问题讨论】:

标签: php regex pcre


【解决方案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 的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2011-06-15
    • 2012-05-07
    • 2015-07-23
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多