Смущает группа совпадений в Java регулярное выражение


у меня есть следующие строки

typeName="ABC:xxxxx;";

мне нужно принести слово ABC,

я написал следующий фрагмент кода

Pattern pattern4=Pattern.compile("(.*):");
matcher=pattern4.matcher(typeName);

String nameStr="";
if(matcher.find())
{
    nameStr=matcher.group(1);

}

так что если я поставлю group(0) Я ABC: но если я ставлю group(1) это ABC, поэтому я хочу знать

  1. что это 0 и 1 в смысле? Будет лучше, если кто-нибудь сможет объяснить мне на хороших примерах.

  2. шаблон регулярного выражения содержит : в нем, так зачем group(1) результат опускает что? Обнаруживает ли группа 1 все слова в скобках?

  3. Итак, если я поставлю еще две скобки, такие как,s*(d*)(.*): тогда будет две группы? group(1) вернет (d*) части и group(2) вернуть (.*) часть?

фрагмент кода был дан с целью очистить мои путаницы. Это не тот код, с которым я имею дело. Приведенный выше код можно сделать с помощью String.split() в гораздо более простой способ.

3 92

3 ответа:

сбор и группировка

захват группы(pattern) создает группа и захват собственность.

связанный один, который вы можете часто видеть (и использовать) является (?:pattern), который создает группа без захват свойство, отсюда и название группа без захвата.

группа обычно используется, когда нужно повторить последовательность шаблонов, например (\.\w+)+, или указать, где должно действовать чередование, например ^(0*1|1*0)$ (^, потом 0*1 или 1*0, потом $) и ^0*1|1*0$ (^0*1 или 1*0$).

группа захвата, помимо группировки, также будет записывать текст, соответствующий шаблону внутри группы захвата (pattern). Используя Ваш пример, (.*):,.* игр ABC и : игр :, и с .* находится внутри группы захвата (.*) текст ABC зафиксировано для группы захвата 1.

номер группы

вся картина определена номер группы 0.

любая группа захвата в шаблоне начинает индексирование с 1. Индексы определяются порядком открывающие скобки групп захвата. В качестве примера, вот все 5 групп захвата в следующем шаблоне:

(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
|     |                       |          | |      |      ||       |     |
1-----1                       |          | 4------4      |5-------5     |
                              |          3---------------3              |
                              2-----------------------------------------2

номера групп используются в обратной ссылке \n в шаблоне и $n в строку замены.

в другое регулярное выражение вкусов (в нестандартном месте, на Perl), они также могут быть использованы в подпрограмма звонки.

вы можете получить доступ к тексту, сопоставленному определенной группой с Matcher.group(int group). Номера групп могут быть идентифицированы с помощью правила, указанного выше.

в некоторых регулярных выражениях вкусов (PCRE, Perl), есть ветке сбросить функция, которая позволяет использовать такое же количество на захват групп в разных ветвях чередования.

имя группы

из Java 7, Вы можете определить названная группа захвата(?<name>pattern), и вы можете получить доступ к содержимому совпали с Matcher.group(String name). Регулярное выражение длиннее, но код более значим, так как он указывает, что вы пытаетесь сопоставить или извлечь с регулярным выражением.

группа имена используются в back-reference \k<name> в шаблоне и ${name} в строку замены.

именованные группы захвата по-прежнему пронумерованы с той же схемой нумерации, поэтому к ним также можно получить доступ через Matcher.group(int group).

внутренне, реализация Java просто сопоставляет имя с номером группы. Таким образом нельзя использовать одно и то же имя для 2 различных групп захвата.

Для Всех Нас

вот простой и понятный пример того, как это работает

регулярное выражение: ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

строку: "!* UserName10 John Smith 01123 *!"

group(0): UserName10 John Smith 01123
group(1): UserName10
group(2):  
group(3): John Smith
group(4):  
group(5): 01123

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

я включил !* и *! с обеих сторон, чтобы было понятнее. Обратите внимание, что ни один из этих символов не находится в регулярном выражении и поэтому не будет создан в результатах. Группа(0) просто дает вам всю соответствующая строка (Все мои критерии поиска в одной строке). Группа 1 останавливается прямо перед первым пробелом, так как символ пробела не был включен в критерии поиска. Группы 2 и 4-это просто пробел, который в этом случае буквально является символом пробела, но также может быть вкладкой или строкой и т. д. Группа 3 включает в себя пространство, потому что я положил его в критерии поиска ... так далее.

надеюсь, что это имеет смысл.

скобочки () используются для включения группировки регулярных выражений.

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

и group(0) содержится вся соответствующая строка.

если бы у вас было больше групп (читайте (...)) он будет помещен в группы со следующими индексами (2, 3 и так далее).