【问题标题】:Regex add space between all punctuation正则表达式在所有标点符号之间添加空格
【发布时间】:2015-10-05 17:12:25
【问题描述】:

我需要在字符串中的所有标点符号之间添加空格。

\\ "Hello: World." -> "Hello : World ."
\\ "It's 9:00?"    -> "It ' s 9 : 00 ?"
\\ "1.B,3.D!"      -> "1 . B , 3 . D !"

我认为正则表达式是要走的路,匹配所有非标点符号[a-ZA-Z\\d]+,在之前和/或之后添加一个空格,然后提取匹配所有标点符号[^a-ZA-Z\\d]+ 的余数。

但我不知道如何(递归?)调用这个正则表达式。看第一个例子,正则表达式只会匹配"Hello"。我正在考虑通过不断删除和附加匹配的正则表达式的第一个实例来构建一个新字符串,而原始字符串不为空。

private String addSpacesBeforePunctuation(String s) {
    StringBuilder builder = new StringBuilder();
    final String nonpunctuation = "[a-zA-Z\\d]+";
    final String punctuation = "[^a-zA-Z\\d]+";

    String found;
    while (!s.isEmpty()) {

        // regex stuff goes here

        found = ???; // found group from respective regex goes here
        builder.append(found);
        builder.append(" ");
        s = s.replaceFirst(found, "");
    }

    return builder.toString().trim();
}

但是,这感觉不是正确的方法……我想我把事情复杂化了……

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您可以在 Java 中使用标点符号属性 \p{Punct} 使用基于环视的正则表达式:

    str = str.replaceAll("(?<=\\S)(?:(?<=\\p{Punct})|(?=\\p{Punct}))(?=\\S)", " ");
    
    • (?&lt;=\\S) 如果 prev char 不是空格,则断言
    • (?&lt;=\\p{Punct}) 如果前一个字符是标点字符,则断言一个位置
    • (?=\\p{Punct}) 如果下一个字符是标点字符,则断言一个位置
    • (?=\\S) 如果下一个字符不是空格,则断言

    IdeOne Demo

    【讨论】:

    • 现在如果有标点符号,它会在字符串末尾添加一个空格。
    • @RealSkeptic:很好的收获。我已经修复它,现在检查我更新的正则表达式和演示。
    • @anubhava 糟糕的连接。不得不放弃。查看 RealSkeptic 的评论!
    • @laune:是的,我已经根据该评论更新了正则表达式,请立即查看。
    • @anubhava 我认为在试图理解它时不那么令人头疼的是:"(?&lt;=\\S)(?=\\p{Punct})|(?&lt;=\\p{Punct})(?=\\S)"
    【解决方案2】:

    当你看到一个标点符号时,你有四种可能:

    1. 标点被空格包围
    2. 标点前面有一个空格
    3. 标点后跟空格
    4. 标点符号前后都没有空格。

    这是正确替换的代码:

    String ss = s
        .replaceAll("(?<=\\S)\\p{Punct}", " $0")
        .replaceAll("\\p{Punct}(?=\\S)", "$0 ");
    

    它使用两个表达式 - 一个匹配数字 2,一个匹配数字 3。由于表达式是相互叠加应用的,因此它们也处理数字 4。数字 1 无需更改。

    Demo.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多