Java 使用零宽度断言负前瞻来匹配执行';s包含字符串“s”;abc";
大家好: 我尝试使用零宽度断言负前瞻来匹配包含字符串“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
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
类也有它们。