大家好: 我正在尝试使用零宽度断言负向前瞻来匹配一个包含字符串“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〜
答案 0 :(得分:4)
环顾四周开始在职位上做事,而不是在角色上。因此,使用字符串"abc"
,正则表达式的这一部分:(?!abc).
开始展望位置 之前 "a"
你的字符串。该位置是"a"
之前的空字符串。这就是它无法匹配的原因。
答案 1 :(得分:1)
Hum,这与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 /.