【问题标题】:Fix malformed ellipses in a string修复字符串中格式错误的省略号
【发布时间】:2015-10-14 23:49:29
【问题描述】:

我想修复 String 中格式错误的省略号 (...)。

"Hello.. World.."
"Hello... World..."     // this is correct
"Hello.... World...."
"Hello..... World....."

应该全部改正为:

"Hello... World..."

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

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

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

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

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

这样的工作:

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

...但一定有更好的方法!

【问题讨论】:

  • 只有两个或更多句点被三个替换?
  • line.replaceAll("\\.+", "..."); 怎么样?这将用您想要的... 替换任何点序列(例如..............)序列。
  • 这是一个“gimme teh codez”问题。它应该关闭

标签: java regex string


【解决方案1】:

您可以替换任意两个或多个.

[.]{2,}

...

【讨论】:

    【解决方案2】:

    为什么不保持简单?

    \.\.+
    

    如果您真的不希望它与 3 人一组发生混乱,可以这样做:

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

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

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

    链接:https://www.myregextester.com/?r=d41b2f7e

    【讨论】:

    • 这很好用,但用户必须记住,在创建 Java 字符串时,他们需要一个双转义字符,如 String pattern = "\\.\\.+" ;
    【解决方案3】:

    你想要下面的东西(非转义形式):

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

    Online examples

    基本上,在两点的情况下,负后瞻和前瞻用于防止它们匹配三点序列。

    【讨论】:

      【解决方案4】:

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

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

      这具有不替换格式错误的省略号以外的其他标点符号的优点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 2019-07-24
        • 1970-01-01
        • 2010-10-11
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多