Lookahead регулярное выражение производит неожиданную группу - PullRequest
1 голос
/ 03 июня 2010

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

Вот пример кода на Java:

public class TestRegex { 
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("/test/(((?!\\.html).)+)\\?(.+)");
        Matcher matcher = pattern.matcher("/test/page?param=value");
        System.out.println(matcher.matches());
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
    }
}

Запустив этот код, можно получить следующий вывод:

правда
страница
е

Что не так с моим регулярным выражением, поэтому вторая группа содержит букву e вместо param=value?

1 Ответ

3 голосов
/ 03 июня 2010

Вы делаете:

Pattern.compile("/test/(((?!\\.html).)+)\\?(.+)")
//                     ^^            ^ ^   ^  ^
//                     ||            | |   |  |
//                     |+------2-----+ |   +-3+
//                     |               |  
//                     +-------1-------+                  

Попробуйте:

Pattern.compile("/test/((?:(?!\\.html).)+)\\?(.+)")
//                     ^                 ^   ^  ^
//                     |                 |   |  |
//                     |                 |   +-2+
//                     |                 |  
//                     +--------1--------+  

Другими словами: (?:...) делает эту группу не захватывающей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...