删除单个逗号但不删除句子中的3个相邻逗号

时间:2015-08-13 12:02:01

标签: java regex

在下面的句子中:

String res = [what, ask, about, group, differences, , , or, differences, in, conditions, |? |]

我想删除单个逗号(,),但不想删除三个相邻的逗号。

我尝试使用此正则表达式:res.replaceAll("(,\\s)^[(,\\s){3}]", " ")但它无效。

4 个答案:

答案 0 :(得分:3)

一种简单的方法是链接两个replaceAll调用,而不是只使用一种模式:

String input = 
"[what, ask, about, group, differences, , , or, differences, in, conditions, |? |]";

System.out.println(
    input
        // replaces
        //           | comma+space not preceded/followed by other comma
        //           |                 | with space
        .replaceAll("(?<!, ), (?!,)", " ")
        // replaces
        //           | 3 consecutive comma+spaces
        //           |          | with single comma+space
        .replaceAll("(, ){3}", ", ")
);

<强>输出

[what ask about group differences, or differences in conditions |? |]

答案 1 :(得分:2)

您可以在find方法中使用此替换代码:

String s = "[what, ask, about, group, differences, , , or, differences, in, conditions, |? |]";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("((?:\\s*,){3})|,").matcher(s);
while (m.find()) {
    if (m.group(1) != null) {
        m.appendReplacement(result, ",");
    }
    else {
        m.appendReplacement(result, "");
    }
}
m.appendTail(result);
System.out.println(result.toString());

请参阅IDEONE demo

输出:[what ask about group differences, or differences in conditions |? |]

正则表达式 - ((?:\\s*,){3})|, - 匹配2个备选:用可选空格(被捕获)分隔的3个逗号,或者只是逗号。如果我们得到捕获,我们用逗号替换。如果捕获为空,我们匹配一个逗号,将其删除。

答案 2 :(得分:1)

您也可以使用:

String res = "[what, ask, about, group, differences, , , or, differences, in, conditions, |? |]";
res.replaceAll("(?<=\\w),(?!\\s,)|(?<!\\w),\\s","");
  • (?<=\\w),(?!\\s,) - 逗号以字开头,而不是被逗弄 其他逗号,
  • (?<!\\w),\\s - 逗号前面没有单词

答案 3 :(得分:1)

另一种可能的方法:

.replaceAll("(,\\s){2,}|,", "$1")
  • (,\\s){2,}会尝试找到两个或更多,,并将其中一个存储在编入索引为1的群组中
  • ,可以匹配以前的正则表达式未使用的逗号,这意味着它是单个逗号

替换$1使用来自第1组的匹配

  • 如果我们发现, , ,我们要将其替换为,,则此类文字将放在第1组
  • 如果我们只找到,,那么我们想要用任何东西替换它,并且因为早期的正则表达式找不到它的匹配所有的组(在我们的例子中是组1)也是空的。