我只需要在字符串的引用部分中删除所有空格。
给这个:
10 00,400,"a1 b2 c3 ",zz xx,100
我需要这个:
10 00,400,"a1b2c3",zz xx,100
显然,仅将其限制在引用区域是我遇到麻烦的原因。
字符串的长度会有所不同,并且可以有多个引用部分。
不使用正则表达式 - 但有效
public String replaceWithinQuotes(String input) {
String[] output = input.split("\"");
StringBuilder builder = new StringBuilder();
for ( int i =0; i < output.length-1; i++ ) {
if ( i %2 == 0 ) {
builder.append(output[i]);
} else {
builder.append(output[i].replaceAll("[ ]+", ""));
}
builder.append("\"");
}
builder.append(output[output.length-1]);
return builder.toString();
}
注意 - 如果你使用这个 - 确保数组的长度是奇数。如果不是,那么您的引号不平衡,您必须以适合您的应用程序的任何方式处理它。
假设引号是平衡的,那么您可以实现这样的方法:
public static void main(String[] args) {
String str = "10 00,400,\"a1 b2 c3 \",zz xx,100, \"a b\"";
StringBuffer sb = new StringBuffer();
Matcher matcher = Pattern.compile("\"([^\"]+)\"").matcher(str);
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group().replaceAll("\\s+", ""));
}
System.out.println(sb.toString());
}
这打印:
10 00,400,"a1b2c3",zz xx,100, "ab"
这是一个小例程,当文本中有一组引号时,它似乎工作得很好:
public static String cropSpacesWithinQuotes(String expression) {
Pattern pattern = Pattern.compile("\"[\\S*\\s\\S*]*\"");
StringBuilder noSpaces=new StringBuilder();
int initialPosition=0;
Matcher matcher = pattern.matcher(expression);
while (matcher.find(initialPosition)) {
int pos=matcher.start();
noSpaces.append(expression.substring(initialPosition, pos-initialPosition));
initialPosition=matcher.end();
noSpaces.append(matcher.group().replaceAll(" ", ""));
}
noSpaces.append(expression.substring(initialPosition));
return(noSpaces.toString());
}
执行一些单元测试时,我意识到当有更多的一对引号时,两组中的文本也会被裁剪。对变量 initialPosition 的一些操作应该可以解决您的问题。
我希望这有帮助。