Использование отрицательных утверждений нулевой ширины для сопоставления строки, которая содержит строку "abc"
Привет всем: я пытаюсь использовать отрицательные выражения утверждений нулевой ширины, чтобы соответствовать строке, которая содержит строку "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". Может кто-нибудь, пожалуйста, выяснить, как это работает? ТКС ~
2 ответа
Осмотры начинают делать свое дело на позициях, а не на персонажах. Итак, со строкой "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/.