Мой Java регулярное выражение не захватывает группу - PullRequest
2 голосов
/ 12 марта 2010

Я пытаюсь сопоставить имя пользователя с регулярным выражением. Пожалуйста, не предлагайте разделение.

USERNAME=geo

Вот мой код:

    String input = "USERNAME=geo";
    Pattern pat = Pattern.compile("USERNAME=(\\w+)");
    Matcher mat = pat.matcher(input);
    if(mat.find()) {
        System.out.println(mat.group());
    }

почему он не находит geo в группе? Я заметил, что если я использую .group(1), он находит имя пользователя. Однако метод group содержит USERNAME=geo. Почему?

Ответы [ 5 ]

5 голосов
/ 12 марта 2010

Поскольку group() эквивалентно group(0), а группа 0 обозначает весь шаблон.

Из документации :

public String group(int group)

Группой ноль обозначен весь шаблон, поэтому выражение m.group(0) эквивалентно m.group()

Как вы узнали, с вашим шаблоном, group(1) дает вам то, что вы хотите.

Если вы настаиваете на использовании group(), вам придется изменить шаблон на что-то вроде "(?<=USERNAME=)\\w+".

3 голосов
/ 12 марта 2010

Как говорит Matcher.group() javadoc, он «возвращает входную подпоследовательность, совпадающую с предыдущим соответствием», а предыдущим соответствием в вашем случае было «USERNAME = geo», поскольку вы вызвали find().

Напротив, метод group(int) возвращает определенную группу. Группы захвата нумеруются путем подсчета открывающих скобок слева направо, поэтому первая группа будет соответствовать «гео» в вашем случае.

1 голос
/ 12 марта 2010

Для вашего решения вот что работает:

public static void main(String[] args) {
        String input = "USERNAME=geo";
        Pattern pat = Pattern.compile("USERNAME=(\\w+)");
        Matcher mat = pat.matcher(input);
        if(mat.find()) {
            System.out.println(mat.group(1));
        }
    }

Выход гео

Причина

Строка java.util.regex.Matcher.group (int группа)
Возвращает входную подпоследовательность захваченный данной группой во время предыдущий матч

Для совпадения m, последовательность ввода s и групповой индекс г, выражения m.group (g) и s.substring (m.start (g), m.end (g)) эквивалентны.

1 голос
/ 12 марта 2010

Таким образом, VAR.group (int i) вернет i-ю группу захвата регулярного выражения. 0 - полная строка Вам нужно позвонить .group (1)

1 голос
/ 12 марта 2010

Это потому, что group это предполагается , чтобы вернуть строку, соответствующую шаблону во всей его полноте. Чтобы получить группу в этой строке, вам нужно передать желаемый номер группы.

Подробнее см. здесь , перефразируя ниже:

группа

public String group ()
Возвращает входную подпоследовательность, совпадающую с предыдущим соответствием.

public String group (int group)
Возвращает входную подпоследовательность, захваченную данной группой во время предыдущей операции сопоставления.
Группы захвата индексируются слева направо, начиная с единицы. Группа ноль обозначает весь шаблон, поэтому выражение m.group (0) эквивалентно m.group ().

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