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

环顾四周开始在位置上做他们的事情,而不是在角色上。因此,使用 string "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 回答