replaceFirst в Groovy выбрасывает нелегальную групповую ссылку - PullRequest
0 голосов
/ 15 марта 2011

У меня есть следующий код:

String newStr = "aa\$";
print newStr;
print "wwwww ? eeee".replaceFirst("\\?", "'${newStr}'"); // (3)

и я продолжаю получать - в строке 3 - следующую ошибку:

Caught: java.lang.IllegalArgumentException: Illegal group reference
    at com.example.MyBuilder.main(MyBuilder.groovy:196)

Похоже, что replaceFirst игнорирует, что $ было экранировано. Как я мог позволить моему коду работать? Кто-нибудь испытывает такую ​​ошибку?

Ответы [ 2 ]

6 голосов
/ 15 марта 2011

Первый

String newStr == "aa\$"

должно быть

String newStr = "aa\$"

Тогда, поскольку вы используете обычные строки для объявления своего регулярного выражения, вам нужно дважды экранировать знак доллара:

String newStr = "aa\\$"

Или используйте косые строки:

String newStr = /aa\$/
0 голосов
/ 15 марта 2011

Я нашел рабочее решение для моей проблемы: String newStr == "aa\\\$"; Вам нужно иметь три обратных слеша.Первая обратная косая черта (справа налево) экранирует $, поэтому Groovy Interpreter не понимает $ как метку для переменной.

Два следующих слеша должны экранировать $ для replaceFirst , потому что $ интерпретируется как Matcher.appendReplacement () - вызывается внутри replaceFirst- как группировка .Это неожиданно, но хорошо документировано в поведении JavaDoc :

обратные косые черты (\) и знаки доллара ($) в строке замены могут привести к тому, что результаты будут отличаться от результатов, еслирассматривались как буквальная замена строки

пс.После борьбы с экранированием другого «специального» символа - обратной косой черты - я переключился на String.replace (CharSequence, CharSequence) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...