Регулярное выражение, называемое поддержкой групп захвата в Java 7

Так как API-интерфейс регулярных выражений Java 7 предлагает поддержку названных групп захвата. Метод java.util.regex.Matcher.group(String) возвращает входную подпоследовательность, захваченную данной группой named-capture, но нет примера доступны для документации по API.

Каков правильный синтаксис для указания и извлечения именованной группы захвата в Java 7?

Ответы

Ответ 1

Указание названной группы захвата

Используйте следующее регулярное выражение с одной группой захвата в качестве примера ([Pp]attern).

Ниже приведены четыре примера того, как указать группу захвата имен для регулярного выражения выше:

(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)

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

[A-Za-z][A-Za-z0-9]*

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

Backreference названная группа захвата в regex

В обратная ссылка содержимого, сопоставленного именованной группе захвата в regex (соответствует 4 приведенным выше примерам):

\k<Name>
\k<group1>
\k<name>
\k<NAME>

Именованная группа захвата по-прежнему пронумерована, поэтому во всех четырех примерах она может быть обратная ссылка \1 в соответствии с нормальным.

Обратитесь к названной группе захвата в строку замены

В обратитесь к группе захвата в строке замены (см. 4 примера выше):

${Name}
${group1}
${name}
${NAME}

То же, что и выше, во всех 4 примерах содержание группы захвата можно ссылаться на $1 в заменяющей строке.

Именованная группа захвата в COMMENT mode

Используя (?<name>[Pp]attern) в качестве примера для этого раздела.

Реализация Oracle режима COMMENT (встроенный флаг (?x)) анализирует следующие примеры, чтобы они были идентичны регулярному выражению выше:

(?x)  (  ?<name>             [Pp] attern  )
(?x)  (  ?<  name  >         [Pp] attern  )
(?x)  (  ?<  n  a m    e  >  [Pp] attern  )

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

То же имя для разных групп захвата?

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

Именованные API-интерфейсы, связанные с захватом

Новые методы в классе Matcher для поддержки получения захваченного текста по имени группы:

Соответствующий метод отсутствует в классе MatchResult с Java 8. Существует текущее Запрос на повышение JDK-8065554 для этой проблемы.

В настоящее время нет API для получения списка названных групп захвата в регулярном выражении. Нам нужно перепрыгнуть через дополнительные обручи, чтобы получить его. Хотя это совершенно бесполезно для большинства целей, за исключением написания тестера регулярных выражений.

Ответ 2

Новый синтаксис для именованной группы захвата (?<name>X) для соответствующей группы X с именем "name". Следующий код захватывает регулярное выражение (\ w +) (любая группа буквенно-цифровых символов). Чтобы назвать эту группу захвата, вы должны добавить выражение? в круглых скобках перед захватом регулярного выражения.

Pattern compile = Pattern.compile("(?<teste>\\w+)");
Matcher matcher = compile.matcher("The first word is a match");
matcher.find();
String myNamedGroup= matcher.group("teste");
System.out.printf("This is yout named group: %s", myNamedGroup);

Этот код возвращает следующие выходные данные:

Это ваша именованная группа: