仅当行不以注释分隔符开头时,正则表达式才匹配值

时间:2012-02-12 20:13:29

标签: php regex

我想我需要一个使用后面看的正则表达式。我希望正则表达式匹配字符串中的'this',只要它不在'//'

之后

因此,例如,如果这是字符串,它将匹配'this':

  

我用它作为我的例子

但不是如果:

  

//我正在使用它作为我的例子

2 个答案:

答案 0 :(得分:2)

这个正则表达式应该这样做:

^([^/]|/(?!/))*this

([^/]|/(?!/))*匹配任何不包含//的序列。

答案 1 :(得分:1)

这是许多情况中的一种,其中lookbehind似乎是工作的明显工具,但你不能使用它。主要问题是,lookbehind子表达式不能使用?*+{min,max}等量词,因此这不起作用:

preg_match('~(?<!//.*)\bthis\b~', $subject, $match);  // nope!  

在大多数正则表达式中,您必须将整行与正则表达式匹配,该正则表达式不允许//出现在您要查找的令牌之前的任何位置。 @Gumbo展示了一种方法,这是另一种方式:

preg_match('~^(?:(?!//).)*\bthis\b~', $subject, $match); 

如果您的目标是将令牌替换为另一个令牌 - 例如,将this替换为that - 您必须先捕获其中的内容并将其重新插入:

preg_replace('~^((?:(?!//).)*)\bthis\b~', '$1that', $subject);

然而,PHP提供了另一种选择:\K,匹配点重置操作符(或者我喜欢称之为“穷人的Lookbehind”)。

preg_match('~^(?:(?!//).)*\K\bthis\b~', $subject, $match); 

你以通常的方式匹配前面的事情,但\K告诉正则表达式引擎假装匹配真正在\bthis\b之前开始,而不是在开头字符串,因此$match[0]的值只是"this"。如果您正在进行替换,则无需捕获前面的内容并将其重新插入:

preg_replace('~^(?:(?!//).)*\K\bthis\b~', 'that', $subject);

\K起源于Perl正则表达式。