0

我正在做一些重大的重构。

[a-z_]*(->|::)[sg]et_source\s*\(

匹配任何东西

$this->get_source() 
$foobar->set_source ($x)
self::get_source()

现在我想排除一个特定的类,比如说我希望 [a-z_]* 部分不匹配“foobar”,例如

foobar::get_source()
$foobar->get_source()

[] 中是否有 AND 运算符,还是我需要一些负面的后视?

编辑:我不解析也不验证代码,所以这里没有安全问题。这将是一个临时预提交钩子,用于警告重构后被认为已弃用的方法调用。

提前致谢。

4

3 回答 3

1

您可以像这样使用负面的lookbehind:

[a-z_]+(?<!foobar)(->|::)[sg]et_source\s*\(

另请注意,在交替部分中->|::,您不应使用字符类。

于 2013-10-02T14:14:06.873 回答
0

就我个人而言,我会构建匹配器组并处理代码中的非条件。

([a-z_])*[->|::][sg]et_source\s*\(

然后用我选择的语言(注意相关组周围的括号):

if $1 == foobar then exclude

我一直发现正则表达式更擅长表达您想要匹配的内容,而不是您想要排除的内容。

但是,如果您的正则表达式引擎支持,您可以查看负前瞻。

于 2013-10-02T14:04:21.513 回答
0

我同意 Andrew White 的观点,你应该在正则表达式之外这样做。

顺便说一句,您的正则表达式并不完全正确。将其更改为:

[a-z_]+(?:\->|::)[sg]et_source\s*\(
于 2013-10-02T14:09:06.997 回答