有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java替换使用正则表达式的单词中第一个不在单词开头的字符

例如: “initial”应返回“ineetial”,“alumne”应返回“alumne”,而“illumati”应返回“illumeenati”

但是,使用此代码:

str = str.replaceAll("(\\w+)i(.?)", "$1ee$2");

我不断地听到“初始”、“明矾”和“发光”,我不明白为什么


共 (2) 个答案

  1. # 1 楼答案

    为什么

    因为\\w+中的+在默认情况下是贪婪的。在+\\w+)之后添加不情愿的量词?,以进行尽可能短的匹配

    让我们考虑这个例子,

    initial
    

    正则表达式

    (\\w+)i(.?)
    

    在上面的\w+捕获到最后的i(不包括i)中,因此init将被组1捕获。然后i匹配t后面的i,然后它将下一个字符捕获到组2中(这是可选的)。因此,用$1ee$2替换匹配的字符将得到initeea,而不匹配的l将添加到最终结果中

  2. # 2 楼答案

    使用以下Pattern,并使用不情愿的量词作为初始单词字符:

    String[] input = {"initial", "alumni", "illuminati"};
    for (String s: input) {
        System.out.println(s.replaceAll("(\\w+?)i(.*)", "$1ee$2"));
    }
    

    输出

    ineetial
    alumnee
    illumeenati