我想我需要一个使用后面看的正则表达式。我希望正则表达式匹配字符串中的'this',只要它不在'//'
之后因此,例如,如果这是字符串,它将匹配'this':
我用它作为我的例子
但不是如果:
//我正在使用它作为我的例子
答案 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正则表达式。