Ответ 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 для поддержки получения захваченного текста по имени группы:
-
group(String name)
(из Java 7) -
start(String name)
(от Java 8) -
end(String name)
(от Java 8)
Соответствующий метод отсутствует в классе MatchResult
с Java 8. Существует текущее Запрос на повышение JDK-8065554 для этой проблемы.
В настоящее время нет API для получения списка названных групп захвата в регулярном выражении. Нам нужно перепрыгнуть через дополнительные обручи, чтобы получить его. Хотя это совершенно бесполезно для большинства целей, за исключением написания тестера регулярных выражений.