文字列の引用符で囲まれたセクション内でのみすべての空白を削除する必要があります。
これを与える:
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());
}
いくつかの単体テストを実行すると、引用符のペアが1つ以上ある場合、2つのセット内のテキストのスペースもトリミングされていることに気付きました。変数initialPositionを操作すると、問題が解決するはずです。
これがお役に立てば幸いです。