【发布时间】:2018-08-07 23:29:10
【问题描述】:
我最近正在解决一个问题,以删除字符串中的重复单词,即“我很好”变成“我很好”。但我注意到一些奇怪的事情,正则表达式适用于所有不同的情况,除了一种情况,我不明白为什么。
这是我的代码:
String regex = "\\b(\\w+)(\\s+\\1\\b)+";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
String input = "INPUT";
Matcher m = p.matcher(input);
// Check for subsequences of input that match the compiled pattern
while (m.find()) {
input = input.replaceAll(m.group(), m.group(1));
}
// Prints the modified sentence.
System.out.println(input);
现在一旦给出INPUT:
我是凌晨 2 点,凌晨 1 点是个好人
输出:
我凌晨 2 点凌晨 1 点是个好人
仍然有两个重复的“am”。 现在如果 INPUT 是:
我是凌晨 2 点,凌晨 1 点,我是个好人
输出:
我凌晨 2 点凌晨 1 点是个好人
没有重复的“am”
我不知道为什么会这样,有人可以帮忙吗?
【问题讨论】:
-
您的 Matcher 正在查找过时的输入,因为您在查找循环的中间修改了输入。所以“am am am”会被发现,但不再存在可替换。
-
@PatrickParker 我不确定你的意思,这如何证明 INPUT 选项 2 的输出是合理的,我希望 OPTION 2 返回
i am 2 am am 1 am a good man
标签: java regex string replace pattern-matching