实施例: “初始”应该返回“ineetial”,“校友”应该返回“alumnee”,“illuminati”应该返回“illumeenati”
但是,使用此代码:
str = str.replaceAll("(\\w+)i(.?)", "$1ee$2");
我不断得到'initeeal','alumnee'和'illuminatee',我不明白为什么。
答案 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
将添加到最终结果中。