В чем разница между matcher.group (N) и "$ N" - PullRequest
2 голосов
/ 05 сентября 2011

Ранее сегодня я с удивлением осознал, что matcher.replaceAll("$2") работает, тогда как matcher.replaceAll(matcher.group(2)) не работает ( как предполагалось ).

Я думал, что обассылаются на то же самое: строка, совпадающая с парой захватывающих скобок.

Очевидно, есть небольшая разница, по которой я не смог найти достаточно подробную документацию.

Я нашел это превосходное введение / учебное пособие , относящееся к обоим, но оно не смогло углубиться в более тонкую разницу.

Где я могу найти больше информации об этом?

1 Ответ

1 голос
/ 05 сентября 2011

Из документации API Matcher.replaceAll :

Этот метод сначала сбрасывает этот сопоставитель. Затем сканирует вход последовательность ищет совпадения шаблона. Персонажи, которые не являются часть любого совпадения добавляется непосредственно к результирующей строке; каждый совпадение заменяется в результате заменой строки. замещающая строка может содержать ссылки на захваченные подпоследовательности в виде в методе appendReplacement.

Это означает, что $2 будет принимать значение второй группы каждый раз, когда будет найдено совпадение.

С другой стороны, когда вы используете Matcher.group (2), вы используете его только один раз - поэтому replaceAll () берет просто String со второй группой из первого совпадения, найденного методом find().

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