修复字符串中格式错误的省略号

Fix malformed ellipses in a string

我想修复 String.

中格式错误的省略号 (...)
"Hello.. World.."
"Hello... World..."     // this is correct
"Hello.... World...."
"Hello..... World....."

应全部更正为:

"Hello... World..."

以下正则表达式处理 3 个或更多 个连续 . 的任何实例:

line.replaceAll("\.{3,}", "...");

但是,我不知道如何处理 正好 2 个连续的 . 的情况。我们不能这样做:

line.replaceAll("\.{2}", "...");

例如,对于 "...",上面的代码将 return "......",因为正则表达式将替换前 2 个 .(索引 0 和 1 ),然后是下 2 个 .(索引 1 和 2),结果是 "..." + "..." = "......".

像这样的东西有效:

line.replaceAll("\.{2}", "...").replaceAll("\.{3,}", "...");

...但必须有更好的方法!

你可以通过否定来做到这一点,检测所有 不是 一个或多个单词后跟 "correct" 椭圆的所有内容,并使用正则表达式修复椭圆喜欢:

line.replaceAll("[^\w* ]+([.]{1,})", "...")

这样做的好处是除了畸形的省略号之外,不会替换其他标点符号。

您可以替换任意一组的两个或更多 .:

[.]{2,}

...

你想要像下面这样的东西(未转义的形式):

(?<!\.)\.{2}(?!\.)|\.{4,}

Online examples

基本上,在两点的情况下,负lookbehind和lookahead被用来防止它们匹配三点序列。

为什么不保持简单?

\.\.+

如果您真的不希望它与 3 人一组混为一谈,那就是:

\.{4,}|(?<!\.)\.{2}(?!\.)

它的作用是首先查找大于 3 的组,然后查找 2 的组。“...”的特殊之处在于“...”中有 2 组“..” .所以在 (?!\.) 你寻找第三个“。”在第一个 2 之后。如果是第三个“。”存在然后丢弃该结果。这称为负先行。要丢弃第二个“..”,您必须执行负面回顾。所以 (?<!\.) 寻找那个“。”在第二个“..”之前,如果找到则丢弃此结果。

javascript 无法执行负面回顾,所以我使用了一个使用 Java 编译器的。

Link: https://www.myregextester.com/?r=d41b2f7e