2010-03-11 2 views
2

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

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

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

Из documentation:

public String group(int group)

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

Как вы уже выяснили, с рисунком , group(1) дает вам то, что вы хотите.

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

+0

'group()' не всегда возвращает целую строку. – incarnate

+0

Я хотел сказать «весь узор». Исправленный. – polygenelubricants

+0

Действительно, согласно «Matcher» javadoc: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#cg * Нулевой ноль всегда означает все выражение. * – BalusC

3

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

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

1

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

См here подробности, перефразировать ниже:

группа

общественную группу String()
Возвращает входной подпоследовательности, совпавшего с предыдущим матчем.

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

1

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

+0

Хотя ваш ответ в порядке, в будущем вы, возможно, захотите разработать немного больше, чем другие респонденты. «Лучше научить человека ловить рыбу и т. Д.» – NomeN

1

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

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.group (г) и s.substring (m.start (г), m.end (г)) эквивалентны ,

Смежные вопросы