2

我只需要在字符串的引用部分中删除所有空格。

给这个: 10 00,400,"a1 b2 c3 ",zz xx,100

我需要这个: 10 00,400,"a1b2c3",zz xx,100

显然,仅将其限制在引用区域是我遇到麻烦的原因。

字符串的长度会有所不同,并且可以有多个引用部分。

4

3 回答 3

2

不使用正则表达式 - 但有效

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();
}

注意 - 如果你使用这个 - 确保数组的长度是奇数。如果不是,那么您的引号不平衡,您必须以适合您的应用程序的任何方式处理它。

于 2012-05-22T18:02:20.593 回答
1

假设引号是平衡的,那么您可以实现这样的方法:

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"
于 2012-05-22T18:03:23.310 回答
1

这是一个小例程,当文本中有一组引号时,它似乎工作得很好:

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 的一些操作应该可以解决您的问题。

我希望这有帮助。

于 2012-05-22T18:00:18.963 回答