2

假设您有一条类似于以下内容的 Twitter 消息:

"Hoot, this is soooooo coooool!!!"

我想提出一个 Java 正则表达式,以便 String.replaceAll 产生以下结果:

"Hoot, this is so cool!"

我开始并尝试排列以下内容但没有成功:

original.replaceAll("(.)\\1+", "$1");

有人知道如何想出一个正则表达式来贪婪地将几个连续的字符减少到两个字符吗?解决方案不能将两个重复字符减少为一个(例如,单词 hoot 不应减少为 hot)。

4

2 回答 2

2

如果您需要用两个正好替换 2+ 个字符,您可以稍微修改您的表达式,如下所示:

original.replaceAll("(.)\\1+", "$1$1");

但是,正则表达式中没有足够的信息来创建例外"soooooo"并将其修剪为"so",而不是"soo".

这是关于 ideone 的演示

于 2013-04-08T22:07:54.013 回答
1

使用纯正则表达式,你会得到最好的结果是 dasblinkenlight 显示的,但你的问题不仅仅是用这 2 个字符替换 2+ 个字符。考虑到单词的上下文,您真正想要的是去除额外的重复以正确拼写单词。

例子:

  • “这太酷了”被简化为“so”,而不是“soo”——将 1+ 剥离为 1
  • “这太酷了”被简化为“酷”——从 2+ 到 2
  • "this is hooooot" 简化为 "hot" - 将 1+ 剥离为 1,因为意图是单词 "hot" 而不是 "hoot"
  • 将“hooooooot”简化为“hoot” - 将 2+ 剥离为 2,因为在这种情况下,意图是“hoot”而不是“hot”

对此没有纯正则表达式解决方案。正则表达式不能进行拼写和语法检查。

于 2013-04-08T22:29:48.000 回答