加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式:通过排除匹配,没有预见 – 有可能吗?

发布时间:2020-12-14 06:35:22 所属栏目:百科 来源:网络整理
导读:在某些正则表达式中,不支持[负]零宽度断言(前瞻/后仰)。 这使得非常困难(不可能)声明排除。例如“每一行都没有”foo“就可以了,就像这样: ^((?!foo).)*$ 可以实现同样的事情,而不必使用周围的环境(复杂性和性能问题暂时搁置一边)? ^(f(o[^o]|[^o])|[^f]
在某些正则表达式中,不支持[负]零宽度断言(前瞻/后仰)。

这使得非常困难(不可能)声明排除。例如“每一行都没有”foo“就可以了,就像这样:

^((?!foo).)*$

可以实现同样的事情,而不必使用周围的环境(复杂性和性能问题暂时搁置一边)?

^(f(o[^o]|[^o])|[^f])*$

注意:在客户端上否定匹配而不是使用上述正则表达式,要容易得多。

正则表达式假设每行以一个换行符结尾,如果它不是看到C和grep的正则表达式。

Perl,Python,C和grep中的示例程序都提供相同的输出。

> perl

#!/usr/bin/perl -wn
print if /^(f(o[^o]|[^o])|[^f])*$/;

> python

#!/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 <iostream>
#include <string>
#include <boost/regex.hpp>

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读