позитивный взгляд сзади не ведет себя правильно - PullRequest
0 голосов
/ 03 октября 2019

Фрагмент кода для положительного взгляда ниже

public class PositiveLookBehind {
    public static void main(String[] args) {
        String regex = "[a-z](?<=9)";
        String input = "a9es m9x us9s w9es";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        System.out.println("===starting====");
        while(matcher.find()) {
            System.out.println("found:"+matcher.group()
            +" start index:"+matcher.start()
            +" end index is "+matcher.end()); 
        }
        System.out.println("===ending=====");
    }
}

Я ожидал, что у меня должно быть 4 совпадения, но, к моему удивлению, результат не соответствует.

Может кто-нибудь указать на мойошибка?

Насколько я понимаю, регулярное выражение здесь - это алфавит, которому предшествует цифра 9, которая выполняется в 4 местах.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Проблема

Обратите внимание, что (?<=9) ставится после [a-z]. Что это означает?

Рассмотрим данные типа "a9c".

При запуске regex-engine помещает свой «курсор» в начало строки, которую он повторяет, здесь:

|a9c
^-regex cursor is here

Затем regex-engine пытается сопоставить каждую часть regex-pattern слева направо . Таким образом, в случае [a-z](?<=9) он сначала попытается найти совпадение для [a-z], а после успешного поиска этого совпадения попытается перейти к оценке части (?<=9).

Таким образом, совпадение для [a-z] произойдет здесь:

a9c
*<-- match for `[a-z]`

После этого регулярное выражение совпадения переместит курсор сюда:

a | 9c * ^ --- regex-курсор двигателя ^ ---- соответствует [a-z]

Так что теперь (?<=9) будет оцениваться (обратите внимание на положение курсора |). (?<=subregex) проверяет, существует ли непосредственно перед курсором текст, которому может соответствовать subregex. Но здесь, поскольку курсор находится непосредственно после того, как a (?<=9) «видит» назад, «видит» / включает в себя эти a как данные, подвыражение которых должно проверяться. Но, поскольку a не может быть сопоставлено с 9, оценка не удалась.

Решение (я)

Возможно, вы хотели проверить, стоит ли 9 перед приемлемым письмом. Чтобы достичь этого, вы можете изменить свое регулярное выражение многими способами:

  • с помощью [a-z](?<=9.) вы делаете предварительный тест два предыдущие символы

    a9c|
     ^^
     9. - `9` matches 9, `.` matches any character (one directly before cursor)
    
  • или проще (?<=9)[a-z], чтобы сначала искать 9, а затем искать [a-z], что позволит регулярному выражению соответствовать 9c, если курсор будет на 9|c.

1 голос
/ 03 октября 2019

Ваш текущий шаблон: [a-z](<=9) означает: сопоставьте строчную букву и убедитесь, что позиция сразу после буквы предшествует 9, что противоречит.

Если вы хотитечтобы соответствовать букве, которой предшествует 9, используйте: (<=9)[a-z], что теперь означает: убедитесь, что перед 9, если так, соответствует строчной букве.

...