否定前瞻 - 如果在输入中找到两个单词,则会失败

时间:2012-12-12 10:00:41

标签: regex

我需要一个负面的超前表达,但我不能让它工作:(我希望有人可以帮助我。我需要一个表达式,直到样本在样本中的任何地方都不包含2个单词。例如2个字pie donuts

i sure like eating pie, but i love donuts very much
---> false
i sure like eating but i love donuts very much
---> true
i sure like eating pie, but i love hamburger very much
---> true
i sure like eating donuts, but i love pie very much
---> false
i sure like eating piedonuts very much
---> false

我已经尝试过多种形式,但它不起作用。

3 个答案:

答案 0 :(得分:4)

比使用否定前瞻简单得多只是有两个正则表达式并检查它们是否匹配。

您没有指定语言,但这是Perl中的一个简单示例:

use warnings;
use strict;

while (<DATA>)
{
    my $match = (/pie/ and /donuts/) ? 'false' : 'true';
    print $_;
    print "--> $match\n";
}

__DATA__
i sure like eating pie, but i love donuts very much
i sure like eating but i love donuts very much
i sure like eating pie, but i love hamburger very much
i sure like eating donuts, but i love pie very much
i sure like eating piedonuts very much

答案 1 :(得分:4)

你可以使用两个嵌套在负面内容中的正向前瞻(从字符串的开头开始)来执行此操作:

^(?!(?=.*pie)(?=.*donuts))

因此内部前瞻需要匹配两个单词。如果他们这样做,负向前瞻的内容将匹配,所以前瞻本身将导致模式失败。

如果您的输入中有换行符,请务必使用sdotall选项(否则,.与换行符不匹配。)

答案 2 :(得分:0)

试试这个,当我使用perl兼容时它起作用了

.+(?=(.+(?<!.+?donuts.+?)\s\bpie\b(?!.+donuts.+))|(.+(?<!.+pie.+)\sdonuts(?!.+pie.+))).*$