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

  • Как получить поддержку regex в excel с помощью функции или пользовательской функции?
  • Удалите часть строки после "."
  • Регулярное выражение для строкового литерала в flex / lex
  • AngularJS - удалять пробелы в верхнем и заднем пространстве из поля ввода с использованием регулярного выражения
  • Java: разделение запятой строки, но игнорирование запятых в кавычках
  • Выражение основных критериев запроса доступа в виде регулярных выражений
  • "UnicodeEncodeError: кодек ascii не может кодировать символ"
  • Проверка адресов IPv4 с регулярным выражением
  • Выражения выражения слова регулярного выражения
  • Как извлечь текст из строки с помощью sed?
  • JSLint сообщает «Небезопасно» для моего регулярного выражения - что это значит?
  • Interesting Posts

    Jquery добавляет прослушиватели событий к динамически добавленным элементам

    Почему статическое поле должно быть доступно статическим способом?

    Замена строк в Objective-C

    UIWebView: когда страница действительно заканчивала загрузку?

    Можно ли улучшить качество текста в изображении?

    Почему rails default_scope часто рекомендуют?

    Почему я не могу контролировать скорость моего процессора?

    Linux и советы по настройке и настройке Windows

    Прекратите открывать новую книгу при запуске Excel

    В чем разница между «статической» и «статической встроенной» функцией?

    Сетевая карта PCIe отключает выход DVI (но не выход VGA) на Shuttle SG41J1 +

    Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон

    Excel VBA – удаление пустых строк

    Excel: подсчет количества значений MAX в диапазоне

    Рамки графического интерфейса Java. Что выбрать? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot?

    Давайте будем гением компьютера.