Java中带有*的正则表达式分组和replaceAll会重复替换

问题描述

可能.*会给您“完全匹配”,然后将匹配减少为“空匹配”(但仍然是匹配)。尝试(.+)(^.*$)代替。两者都按预期工作。

在regexinfo中,星的定义如下:

*(星号)-将上一个项目重复零次或多次。贪婪,因此在尝试进行与前一个项目的匹配较少的置换之前,将匹配尽可能多的项目,直到前一个项目根本不匹配。

解决方法

我在Java中使用Rexexp时遇到问题。示例代码写出了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会替换所有匹配的组,问题是为什么此regexp组在Java中的(.*)字符串上匹配两次ABC_012