另一个正则表达式困境:排除所有x而不是y

时间:2015-04-24 07:11:11

标签: regex

另一个正则表达式困境,我希望找到包含.cc和.h扩展名的所有X文件,其中不包含pb字。

Example:
 Foo.cc
 FooTest.cc
 Bar.cc
 Bar.pb.cc
 Bar.pb.h

Regex result:
 Foo.cc
 FooTest.cc
 Bar.cc

2 个答案:

答案 0 :(得分:3)

使用以下内容:

^((?!pb).)*\.(cc|h)$

(?!pb)是一个负面预测,可以匹配pb未跟随的任何位置。因此((?!pb).)*将匹配任何不包含pb的子字符串。完整的正则表达式可以描述为匹配整个字符串,只要它以'.cc'或'.h'结尾,并且扩展名之前的子字符串不包含'pb'。

Regular expression visualization

Debuggex Demo

注意如果您想匹配多行字符串,则需要将(?m)修饰符添加到使^$工作的正则表达式中在每一行而不是整个字符串。如果您的lang不支持修饰符,请使用基于您使用的函数的标记。

答案 1 :(得分:2)

您可以尝试以下基于正面表达式的负面预测。

^(?!.*?\bpb\b).*\.(?:cc|h)$

(?!.*\bpb\b)否定前瞻断言要匹配的字符串不会包含单词pb。如果没有pb,则只有它会尝试匹配字符串,并且该字符串必须具有cch扩展名。

DEMO