1

みなさん、こんにちは。私は、ゼロ幅アサーションの負の先読みを使用して、文字列「abc」を含む文字列と一致させようとしています。これが私が得たものです。

    Pattern pattern = new Perl5Compiler().compile("((?!abc).)+");
    Perl5Matcher matcher = new Perl5Matcher();
    System.out.println(matcher.matches("abc", pattern));
    System.out.println(matcher.matches("abdas dfas", pattern));
    System.out.println(matcher.matches("d abc ", pattern));
    System.out.println(matcher.matches("fafabcdef", pattern));

結果は次のとおりです。

    false
    true
    false
    false

私が理解できないのは、文字列「abc」が一致しない理由です。アサーション「abc」の後に文字が含まれていません。誰かがこれがどのように機能するかを理解できますか?tks〜

4

2 に答える 2

4

見回しは、キャラクターではなく、位置で自分のことを始めます。したがって、文字列を使用すると"abc"、正規表現のこの部分は、文字列内の位置(?!abc).を先読みし始めます。位置は、の前の空の文字列です。それが一致しない理由です。 "a""a"

于 2011-03-25T07:08:31.290 に答える
1

うーん、それはPerl5が実際にどのように機能するかとは異なります。

$ perl -E'
    for ("abc", "abdas dfas", "d abc ", "fafabcdef") {
        say "$_: ", /((?!abc).)+/ ? "true ($&)" : "false";
    }
'
abc: true (bc)
vabdas dfas: true (abdas dfas)
d abc : true (d )
fafabcdef: true (faf)

暗黙の^と\zが必要です。

$ perl -E'
    for ("abc", "abdas dfas", "d abc ", "fafabcdef") {
        say "$_: ", /^((?!abc).)+\z/ ? "true ($&)" : "false";
    }
'
abc: false
abdas dfas: true (abdas dfas)
d abc : false
fafabcdef: false

/abc/に一致する位置があるために一致しないもの。

于 2011-03-25T19:54:56.070 に答える