Смущает группа совпадений в 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, поэтому я хочу знать
что это
0и1в смысле? Будет лучше, если кто-нибудь сможет объяснить мне на хороших примерах.шаблон регулярного выражения содержит
:в нем, так зачемgroup(1)результат опускает что? Обнаруживает ли группа 1 все слова в скобках?Итак, если я поставлю еще две скобки, такие как,
s*(d*)(.*): тогда будет две группы?group(1)вернет(d*)части иgroup(2)вернуть(.*)часть?
фрагмент кода был дан с целью очистить мои путаницы. Это не тот код, с которым я имею дело. Приведенный выше код можно сделать с помощью String.split() в гораздо более простой способ.
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 и так далее).