Regex обратные ссылки в Java

Я должен был соответствовать число, сопровождаемое собой 14 раз. Затем я пришел к следующему регулярному выражению вregexstor.net/tester:

(\d)\1{14}

редактировать

Когда я вставляю это в мой код, включая обратную косую черту:

"(\\d)\\1{14}"

Я заменил обратную ссылку"\1" посредством"$1" который используется для замены совпадений в Java.

Тогда я понял, что это не работает. Когда вам нужно сделать обратную ссылку на совпадение в REGEX, в Java вы должны использовать"\N", но когда вы хотите заменить его, оператор"$N".

Мой вопрос: почему?

 anubhava09 июн. 2016 г., 21:10
Это не просто Java, в большинстве вариантов regex\N обратная ссылка в регулярном выражении.$ имеет особое значение в регулярных выражениях
 anubhava09 июн. 2016 г., 21:14
Некоторые из них любятpython, sed или жеperl разрешить\N в замен, но дизайнеры Java решили$ обозначение
 Jaumzera09 июн. 2016 г., 21:13
Да, «$» означает конец выражения, но почему они не используют\N заменить тоже?

Ответы на вопрос(1)

Решение Вопроса

$1 это не обратная ссылка ни в регулярных выражениях Java, ни в любом другом виде, о котором я могу думать. Вы используете только$1 когда вызамена что-то:

input = StringUtils.replacePattern(
            input, "^([A-Z]\\d{2}\\.\\d).*$", "$1");
//                                            ^^^^

Существует некоторая дезинформация о том, что такое обратная ссылка, в том числе о том месте, откуда я получил этот фрагмент:простое регулярное выражение Java с обратной ссылкой не работает.

Java смоделировал свой синтаксис регулярных выражений после других существующих разновидностей, где$ был уже мета персонаж. Он привязывает конец строки (или строку в многострочном режиме).

Точно так же Java использует\1 для обратных ссылок. Поскольку регулярные выражения являются строками, они должны быть экранированы:\\1.

С лексической / синтаксической точки зрения это правда, что$1 может быть использован однозначно (в качестве бонуса он предотвратит необходимость «побега зла» при использовании обратных ссылок).

Чтобы соответствовать1 который следует после конца строки, регулярное выражение должно быть$\n1:

this line
1

Просто имеет смысл использовать знакомый синтаксис вместо изменения правил, большинство из которых пришло из Perl.

Первая версия Perl вышла в1987, что намного раньше, чем Java, выпущенная в [1995]

Я откопалman-страницы для Perl 1, которые говорят:

Брекет-конструкция(\ ...\ ) также может быть использован, в этом случае\<digit> соответствуетdigitподстрока (Вне шаблона всегда используйте$ вместо\ перед цифрой. Сфера$<digit> (а также$\`, $& а также$') простирается до конца вмещающей строки BLOCK или eval или до следующего совпадения шаблона с подвыражениями.\<digit> нотация иногда работает вне текущего шаблона, но на нее не следует полагаться.) У вас может быть столько скобок, сколько вы пожелаете. Если у вас более 9 подстрок, переменные$10, $11, ... обратитесь к соответствующей подстроке. В рамках шаблона,\10, \11и т. д. ссылаются на подстроки, если до обратной ссылки было хотя бы столько оставленных паренинов. В противном случае (для обратной совместимости)\10 такой же как\010, Backspace, и\11 такой же как\011, вкладка. И так далее. (\1 через\9 всегда обратные ссылки.)

 Jaumzera09 июн. 2016 г., 21:45
«Java смоделировал свой синтаксис регулярных выражений после других существующих разновидностей, где $ уже был метасимволом. Он привязывает конец строки (или строку в многострочном режиме)», имеет смысл. У вас есть источник?
 dognose09 июн. 2016 г., 21:37
+ один за упоминание разницы между обратными ссылками и заменой.
 Laurel09 июн. 2016 г., 21:58
@Jaumzera я делаю сейчас;)

Ваш ответ на вопрос