Смущает группа совпадений в 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 и так далее).