当前位置:  开发笔记 > 编程语言 > 正文

正则表达式:排除匹配,没有预见 - 是否可能?

如何解决《正则表达式:排除匹配,没有预见-是否可能?》经验,为你挑选了1个好方法。

在一些正则表达式中,不支持[负]零宽度断言(前瞻/后瞻).

这使得排除非常困难(不可能?).例如"每条线上没有 "foo"就可以了",如下所示:

^((?!foo).)*$

如果不使用环视(目前预留的复杂性和性能问题),可以实现同样的目标吗?



1> jfs..:

更新:正如@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


这个正则表达式不正确.它与`f`,`fo`或`barf`不匹配.但是这个:`(f(o([^ o] | $)| [^ o] | $)| [^ f])*$`
在oo之前,答案似乎不适用于带有两个ff的`somethingffoosomething`.
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有