Вопрос:

Regex в Android JAVA - Как указать более 9 обратных ссылок?

java android regex reference backreference

114 просмотра

2 ответа

404 Репутация автора

Я использую несколько групп в поиске Regex и заменяю многие части строки. Я использую $ 1 $ 2 и т. Д. В Android JAVA при использовании String.replaceFirst.

Если я использую более девяти групп в своем поиске Regex при попытке ссылки на них в replaceFirst, например, на $ 10, он заменит первую обратную ссылку, а затем напечатает литерал 0.

Могу ли я в любом случае использовать десятую ссылку? Есть ли другой способ ссылки на него?

Пример, но я пытаюсь использовать более девяти обратных ссылок. 10 долларов видит только 1 доллар.

String.replaceFirst("(hello)(.*)(this)","$1middle$2");
Автор: zeroprobe Источник Размещён: 09.11.2017 12:00

Ответы (2)


0 плюса

90746 Репутация автора

TL; DR Если вы воспринимаете это $10как $1и a 0, то у вашего регулярного выражения нет 10 групп захвата.

В $обратных ссылках в восстановительной стоимости описана в Javadoc для appendReplacementметода:

Строка замены может содержать ссылки на подпоследовательности, захваченные во время предыдущего совпадения: каждое вхождение ${name}или $gбудет заменено результатом оценки соответствующего group(name)или group(g)соответственно. Ведь $gпервое число после $всегда обрабатывается как часть групповой ссылки. Последующие номера включены, gесли они образуют юридическую ссылку на группу. Только цифры '0'через '9'считаются потенциальными компонентами групповой ссылки. Если вторая группа соответствует строке "foo", например, то передача строки замены "$2bar"приведет "foobar"к добавлению в строковый буфер. Знак доллара ($) может быть включен в качестве литерала в строку замены, поставив перед ней обратную косую черту ( \$).

Итак, скажем, у нас есть 11 групп:

System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
                                                 "$11$10$9$3$2$1"));

Здесь мы фиксируем первые 11 символов как отдельные группы, например, group(1)возврат "A"и group(11)возврат "K". Входная строка содержит 14 символов, поэтому последние 3 ( LMN) не заменяются. Результат:

KJICBALMN

Если мы удалим группу захвата 11 из регулярного выражения, то $11это не допустимая ссылка на группу, и будет интерпретироваться как $1и литерал 1:

System.out.println("ABCDEFGHIJKLMN".replaceFirst("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
                                                 "$11$10$9$3$2$1"));

Печать:

A1JICBAKLMN

Итак, если вы воспринимаете это $10как $1обратную ссылку и литерал 0, то у вашего регулярного выражения нет 10 групп .

Автор: Andreas Размещён: 09.11.2017 01:25

0 плюса

22085 Репутация автора

Вы также можете назвать их с помощью, (?<name>...)а затем сослаться на них ${name}.

String.replaceFirst("(?<g1>hello)(?<g2>.*)(?<g3>this)","${g1}middle${g2}");
Автор: kichik Размещён: 09.11.2017 01:45
Вопросы из категории :
32x32