如何创建一个正则表达式,只用两个替换两个或多个连续相同的字符?

时间:2013-04-08 22:01:42

标签: java regex

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

"Hoot, this is soooooo coooool!!!"

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

"Hoot, this is so cool!"

我开始尝试置换以下内容但未成功:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

但是,正则表达式中没有足够的信息为"soooooo"制作例外并将其修改为"so",而不是"soo"

这是demo on ideone

答案 1 :(得分:1)

使用纯正则表达式,你会得到的最好的是dasblinkenlight所展示的,但你的问题不仅仅是简单地用2个字符替换2个字符。你真正想要的是它根据单词的上下文删除额外的重复以正确拼写单词。

示例:

  • “这太酷了”被缩减为“so”,而不是“soo” - 剥离1+到1
  • “这是如此cooooool”被简化为“酷” - 剥离2+到2
  • “这是hooooot”被减少为“热” - 剥离1+为1因为 意图是“热”而非“hoot”
  • “真是一个hooooooot”被简化为“hoot” - 将2+剥离为2,因为 在这种情况下,意图是“hoot”而非“热”

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