3

我需要一个否定的前瞻表达式,但我不能让它工作:(我希望有人可以帮助我。我需要一个表达式,直到样本中的任何地方都不包含 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

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

4

3 回答 3

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
于 2012-12-12T10:05:29.447 回答
4

您可以使用嵌套在一个负数内的两个正向前瞻来做到这一点(全部从字符串的开头开始):

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

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

如果您的输入中可以有换行符,请确保使用sordotall选项(否则,.与换行符不匹配)。

于 2012-12-12T10:25:30.653 回答
0

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

.+(?=(.+(?<!.+?donuts.+?)\s\bpie\b(?!.+donuts.+))|(.+(?<!.+pie.+)\sdonuts(?!.+pie.+))).*$     
于 2012-12-13T07:06:43.257 回答