Использование отрицательных утверждений нулевой ширины для сопоставления строки, которая содержит строку «abc» - PullRequest
1 голос
/ 25 марта 2011

Привет всем: Я пытаюсь использовать утверждения нулевой ширины с отрицательным прогнозом, чтобы соответствовать строке, которая содержит строку «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 ]

4 голосов
/ 25 марта 2011

Осмотры начинают делать свое дело на позициях, а не на персонажах.Итак, со строкой "abc" эта часть вашего регулярного выражения: (?!abc). начинает смотреть вперед на позицию до "a" в вашей строке.Позиция - пустая строка перед "a".Вот почему он не соответствует.

1 голос
/ 25 марта 2011

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/.

...