在一些正则表达式中,不支持[负]零宽度断言(前瞻/后瞻).
这使得排除非常困难(不可能?).例如"每条线上没有 "foo"就可以了",如下所示:
^((?!foo).)*$
如果不使用环视(目前预留的复杂性和性能问题),可以实现同样的目标吗?
更新:正如@Ciantic在评论中指出的那样, "在oo之前有两个ff"失败.
^(f(o[^o]|[^o])|[^f])*$
注意:只是在客户端否定匹配而不是使用上面的正则表达式要容易得多.
正则表达式假设每行都以换行符结尾,如果不是那么请参阅C++和grep的正则表达式.
Perl,Python,C++中的示例程序grep
都提供相同的输出.
perl的
#!/usr/bin/perl -wn print if /^(f(o[^o]|[^o])|[^f])*$/;
蟒蛇
#!/usr/bin/env python import fileinput, re, sys from itertools import ifilter re_not_foo = re.compile(r"^(f(o[^o]|[^o])|[^f])*$") for line in ifilter(re_not_foo.match, fileinput.input()): sys.stdout.write(line)
C++
#include#include #include int main() { boost::regex re("^(f(o([^o]|$)|([^o]|$))|[^f])*$"); //NOTE: "|$"s are there due to `getline()` strips newline char std::string line; while (std::getline(std::cin, line)) if (boost::regex_match(line, re)) std::cout << line << std::endl; }
grep的
$ grep "^\(f\(o\([^o]\|$\)\|\([^o]\|$\)\)\|[^f]\)*$" in.txt
样本文件:
foo 'foo' abdfoode abdfode abdfde abcde f fo foo fooo ofooa ofo ofoo
输出:
abdfode abdfde abcde f fo ofo