我正在做一些重大的重构。
[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运算符,而不是[],还是需要一些负面的背后隐藏?
编辑:我没有解析也没有验证代码,所以这里没有安全问题。这将是一个暂时的预先提交钩子,警告方法调用考虑在重构后弃用。提前致谢。
答案 0 :(得分:1)
您可以使用负面的lookbehind:
[a-z_]+(?<!foobar)(->|::)[sg]et_source\s*\(
另请注意,在交替部分->|::
中,您不应使用字符类。
答案 1 :(得分:0)
就个人而言,我会构建匹配器组并在代码中处理非条件。
([a-z_])*[->|::][sg]et_source\s*\(
然后用我选择的语言(注意问题小组周围的问题):
if $1 == foobar then exclude
我总是发现正则表达式更能表达您想要匹配的内容,而不是您想要排除的内容。
但是,如果您的正则表达式引擎支持,那么您可以查看负向前瞻。
答案 2 :(得分:0)
我同意Andrew White,你应该在正则表达式之外这样做。
BTW你的正则表达式并不完全正确。将其更改为:
[a-z_]+(?:\->|::)[sg]et_source\s*\(