Смутно о группе Matcher в Java regex

У меня есть следующая строка,

typeName="ABC:xxxxx;"; 

Мне нужно взять слово ABC ,

Я написал следующий fragment кода,

 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() намного проще.

Захват и группировка

Захват группы (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 

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

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

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

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

Название группы

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

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

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

Внутри реализация Java просто отображает от имени до номера группы. Поэтому вы не можете использовать одно и то же имя для двух разных групп захвата.

Для остальной части нас

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

Regex: ([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 

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

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

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

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

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

А group(0) содержит целую строку.

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

  • Является gcc 4.8 или более ранней ошибкой регулярных выражений?
  • Как мы можем сопоставить ^ nb ^ n с регулярным выражением Java?
  • Как удалить символы подчеркивания в именах полей с помощью logstash?
  • Подсчет количества вхождений строки внутри другой (Perl)
  • Сравните одну строку с несколькими значениями в одном выражении
  • java.lang.StackOverflowError при использовании RegEx для синтаксического анализа больших строк
  • Regex look-behind без очевидной максимальной длины в Java
  • Как извлечь n-е слово и подсчитать вхождения в строку MySQL?
  • Как использовать регулярные выражения (регулярное выражение) в Microsoft Excel как внутри ячейки, так и в цикле
  • Regex: как получить слова из строки (C #)
  • Полноценная проверка имени домена
  • Давайте будем гением компьютера.