Java 使用零宽度断言负前瞻来匹配执行';s包含字符串“s”;abc";

Java 使用零宽度断言负前瞻来匹配执行';s包含字符串“s”;abc";,java,regex,perl,negative-lookahead,Java,Regex,Perl,Negative Lookahead,大家好: 我尝试使用零宽度断言负前瞻来匹配包含字符串“abc”的字符串,这就是我得到的结果: Pattern pattern = new Perl5Compiler().compile("((?!abc).)+"); Perl5Matcher matcher = new Perl5Matcher(); System.out.println(matcher.matches("abc", pattern)); System.out.println(matcher.ma

大家好: 我尝试使用零宽度断言负前瞻来匹配包含字符串“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”之后不包含任何字符。有谁能弄明白这是怎么回事吗?TK~

环顾四周的人开始在位置上做事,而不是在角色上。因此,对于字符串
“abc”
,正则表达式的这一部分:
(?!abc)。
开始向前看字符串中
“a”
之前的位置。该位置是
“a”
之前的空字符串。这就是它无法匹配的原因。

环顾四周的人开始在位置上做他们的事情,而不是在角色上。因此,对于字符串
“abc”
,正则表达式的这一部分:
(?!abc)。
开始向前看字符串中
“a”
之前的位置。该位置是
“a”
之前的空字符串。这就是它无法匹配的原因。

嗯,这与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/

哼,这与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/

谢谢你的回答,巴特!那么第二个字符串“abdasdfas”呢?根据您所说的,这也将不匹配。@khotyn,不,在字符串
“abdasdfas”
中,没有一个位置(空字符串)前面有子字符串
“abc”
,因此该字符串将匹配。再次感谢,我想我明白了,第一个字符串失败,因为前面的空字符串后面有一个子字符串“abc”“a”,因此匹配失败。关键是
(?!abc)。
在空字符串之后向前看
abc
。@khotyn,是的,你找到了,年轻的草蜢!:)谢谢你的回答,巴特!第二个字符串“abdasdfas”呢?根据你说的,这也将不匹配。@khotyn,不,在字符串
“abdasdfas”中“
没有子字符串前面有子字符串的位置(空字符串)“abc”,因此该字符串将匹配。再次感谢,我认为我已获得它,第一个字符串失败,因为在“a”之前的空字符串后面有子字符串“abc”,因此匹配失败。关键是
(?!abc)。
在空字符串之后向前看
abc
。@khotyn,是的,你找到了,小草蜢!:)Java的“own”
matches()
方法验证/匹配整个字符串,因此它确实具有隐式锚。我猜OP的(非标准的)
Perl5Matcher
类也有它们。Java的“own”
matches()
方法验证/匹配整个字符串,因此它确实有隐式锚。我猜OP的(非标准)
Perl5Matcher
类也有它们。