【问题标题】:Insert space between each punctuation mark在每个标点符号之间插入空格
【发布时间】:2016-03-18 12:46:55
【问题描述】:

我有一个字符串,在每个标点符号前后我想插入一个空格

aaa , bbb . Hello ! here . 我尝试使用replaceAll 方法,我想要类似的东西:

String result = myStr.replaceAll("\\p{Punct}", "\s\\p{Punct}\s");

但由于第二个参数必须是字符串,所以这不起作用。有什么方法可以使用正则表达式来完成吗?或者我必须单独捕获标点符号然后替换它?

【问题讨论】:

    标签: java regex pattern-matching


    【解决方案1】:

    您需要在替换中使用反向引用和文字:

    String result = myStr.replaceAll("\\p{Punct}", " $0 ");
    

    或者(如果你想包装一系列标点符号):

    String result = myStr.replaceAll("\\p{Punct}+", " $0 ");
    

    请参阅下面的demo

    String s = "aaa,fgh!edrf.";
    String result = s.replaceAll("\\p{Punct}", " $0 ");
    System.out.println(result); // => aaa , fgh ! edrf . 
    System.out.println("aaa,,,fgh!!!edrf???".replaceAll("\\p{Punct}+", " $0 "));
    // => aaa ,,, fgh !!! edrf ??? 
    

    【讨论】:

    • 非常接近,但 OP 想要标点前后的空间。暗示。 aaa , , ,
    • @Saleem: " $0 " 在匹配的标点符号周围插入空格。 "\\p{Punct}" 单独匹配每个符号,"\\p{Punct}+" 匹配连续的标点符号块。
    • 我实际上在看// => aaa ,,, fgh !!! edrf ??? 我看到它是在分隔组,但是单独的标点符号。希望你明白了。
    • @Saleem:你用过myStr.replaceAll("\\p{Punct}", " $0 ");吗?我猜不是。
    • @Saleem:根据 OP 的真正需要,我有 2 种选择。
    【解决方案2】:

    您可以匹配每个标点符号,并替换为“$0”:

    String input = "aaa,bbb.Hello!here.";
    String result = input.replaceAll("[.!?\\-]", " $0 ");
    System.out.println (result);
    

    输出:

    aaa , bbb . Hello ! here . 
    

    【讨论】: