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

ネガティブルックアヘッドを使用するよりもはるかに簡単なのは、2つの正規表現を用意し、それらが一致しないことを確認することです。

言語を指定しませんでしたが、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

これは、負の先読みの中にネストされた2つの正の先読み(すべて文字列の先頭から開始)を使用して行うことができます。

^(?!(?=.*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 に答える