使用正则表达式替换第一次出现的字符不在单词的单词的开头

时间:2014-10-02 14:13:28

标签: java regex

实施例: “初始”应该返回“ineetial”,“校友”应该返回“alumnee”,“illuminati”应该返回“illumeenati”

但是,使用此代码:

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

我不断得到'initeeal','alumnee'和'illuminatee',我不明白为什么。

2 个答案:

答案 0 :(得分:2)

使用以下Pattern,并为您的初始字词设置一个不情愿的量词:

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

<强>输出

ineetial
alumnee
illumeenati

答案 1 :(得分:0)

<强>为什么吗

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

让我们考虑这个例子,

initial

正则表达式,

(\\w+)i(.?)

在上面的\w+截至上一个i(不包括i),所以init将被小组1捕获。然后i匹配i之后的t,然后它捕获下一个字符,即。 a进入第2组(这是可选的)。因此,将匹配的字符替换为$1ee$2将为您提供initeea,并且不匹配的l将添加到最终结果中。