Regexp группировки и replaceAll с. * В Java дублирует замену - PullRequest
5 голосов
/ 17 февраля 2011

У меня проблема с использованием Rexexp в Java. Код примера записывает ABC_012_suffix_suffix, я ожидал, что он выведет ABC_012_suffix

    Pattern rexexp  = Pattern.compile("(.*)");
    Matcher matcher = rexexp.matcher("ABC_012");
    String  result  = matcher.replaceAll("$1_suffix");

    System.out.println(result);

Я понимаю, что replaceAll заменяет все совпадающие группы, возникает вопрос, почему эта группа регулярных выражений (.*) совпадает дважды в моей строке ABC_012 в Java?

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011
Pattern regexp  = Pattern.compile(".*");
Matcher matcher = regexp.matcher("ABC_012");
matcher.matches();
System.out.println(matcher.group(0));
System.out.println(matcher.replaceAll("$0_suffix"));

То же самое происходит и здесь:

ABC_012
ABC_012_suffix_suffix

Причина скрыта в методе replaceAll: он пытается find всех подпоследовательностей, которые соответствуют шаблону:

while (matcher.find()) {
  System.out.printf("Start: %s, End: %s%n", matcher.start(), matcher.end());
}

Это приведет к:

Start: 0, End: 7
Start: 7, End: 7

Таким образом, к нашему первому удивлению, сопоставитель находит две подпоследовательности "ABC_012" и другую "".И он добавляет "_suffix" к ним обоим:

"ABC_012" + "_suffix" + "" + "_suffix"
5 голосов
/ 17 февраля 2011

Вероятно, .* дает вам "полное совпадение", а затем уменьшает совпадение до "пустого совпадения" (но все равно совпадение). Попробуйте вместо (.+) или (^.*$). Оба работают как положено.

В regexinfo звезда определяется следующим образом:

* (звездочка) - повторяет предыдущий элемент ноль или более раз. Жадный, поэтому как можно большее количество элементов будет сопоставлено перед попыткой перестановок с меньшим количеством совпадений предыдущего элемента, вплоть до точки, где предыдущий элемент вообще не сопоставляется.

3 голосов
/ 17 февраля 2011

Если вы просто хотите добавить «_suffix» к вашему вводу, почему бы вам просто не сделать:

String result = "ABC_012" + "_suffix";

?

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