正则表达式在所有标点符号之间添加空格

bud*_*udi 3 java regex

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

\\ "Hello: World." -> "Hello : World ."
\\ "It's 9:00?"    -> "It ' s 9 : 00 ?"
\\ "1.B,3.D!"      -> "1 . B , 3 . D !"
Run Code Online (Sandbox Code Playgroud)

我认为正则表达式是要走的路,匹配所有非标点符号[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();
}
Run Code Online (Sandbox Code Playgroud)

然而,这感觉不是正确的方式...我想我已经过度复杂了......

anu*_*ava 5

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

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

IdeOne演示