Java 修复字符串中格式错误的椭圆

Java 修复字符串中格式错误的椭圆,java,regex,string,Java,Regex,String,我想修复字符串中格式错误的省略号(…) "Hello.. World.." "Hello... World..." // this is correct "Hello.... World...." "Hello..... World....." 所有这些都应更正为: "Hello... World..." 以下正则表达式处理3个或更多连续的任何实例: line.replaceAll("\\.{3,}", "..."); 然而,我不知道如何处理这种情况,当正好有两个连续的。我们不能

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

"Hello.. World.."
"Hello... World..."     // this is correct
"Hello.... World...."
"Hello..... World....."
所有这些都应更正为:

"Hello... World..."

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

line.replaceAll("\\.{3,}", "...");
然而,我不知道如何处理这种情况,当正好有两个连续的
。我们不能这样做:

line.replaceAll("\\.{2}", "...");
例如,对于
“…”
,上面的代码将返回
“…”
,因为正则表达式将替换前2个
(索引0和1),然后替换下2个
(索引1和2),从而产生
“…+”=“…”

类似这样的工作原理:

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

……但一定有更好的办法

您可以通过否定来实现,检测不是一个或多个单词后跟“正确”椭圆的所有内容,并使用正则表达式修复椭圆,如:

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

这样做的优点是,除了格式错误的省略号外,不会替换其他标点符号

您可以替换两个或两个以上的

[.]{2,}

使用

时,您需要以下内容(以未替换的形式):

(?


基本上,在两个点的情况下,使用负的lookback和lookahead来阻止它们匹配三个点的序列。

为什么不保持简单

\.\.+
如果你真的不想让它和3人一组搞混,有这样一个:

\.{4,}|(?<!\.)\.{2}(?!\.)
\.{4,}|(?
它首先查找大于3的组,然后再查找2的组。关于“…”的特殊之处是“…”中有2组“…”。因此在
(?!\)
中,您查找前2个之后的第3个“.”。如果第3个“.”存在,则放弃该结果。这称为负前瞻。放弃第2个“.”您必须执行负查找。因此,
(?在第二个“.”之前查找该“.”。如果找到该结果,将丢弃该结果

javascript不能执行反向查找,所以我使用了一个使用Java编译器的


链接:

仅用三个句点替换两个或多个句点?如何使用
行.replaceAll(“\\.+”,“…”)
?这将用所需的
)序列替换任何点序列。这是一个“gimme-teh-codez”问题。应该关闭它。这很好,但用户必须记住,在创建Java字符串时,他们需要一个双转义字符,如字符串模式=“\\.\.+”;
\.{4,}|(?<!\.)\.{2}(?!\.)