正则表达式:匹配字符类但不匹配指定的字符串

时间:2013-10-02 13:58:45

标签: regex

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

[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运算符,而不是[],还是需要一些负面的背后隐藏?

编辑:我没有解析也没有验证代码,所以这里没有安全问题。这将是一个暂时的预先提交钩子,警告方法调用考虑在重构后弃用。

提前致谢。

3 个答案:

答案 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*\(