在下面的句子中:
String res = [what, ask, about, group, differences, , , or, differences, in, conditions, |? |]
我想删除单个逗号(,),但不想删除三个相邻的逗号。
我尝试使用此正则表达式:res.replaceAll("(,\\s)^[(,\\s){3}]", " ")
但它无效。
答案 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)也是空的。