11

PCで実行される次のJava SEコードがあります

public static void main(String[] args) {
    // stringCommaPattern will change
    // ","abc,def","
    // to
    // ","abcdef","        
    Pattern stringCommaPattern = Pattern.compile("(\",\")|,(?=[^\"[,]]*\",\")");
    String data = "\"SAN\",\"Banco Santander, \",\"NYSE\"";
    System.out.println(data);
    final String result = stringCommaPattern.matcher(data).replaceAll("$1");
    System.out.println(result);
}

期待通りの結果が得られています

"SAN","Banco Santander, ","NYSE"
"SAN","Banco Santander ","NYSE"

ただし、Androidになると.

Pattern stringCommaPattern = Pattern.compile("(\",\")|,(?=[^\"[,]]*\",\")");
String data = "\"SAN\",\"Banco Santander, \",\"NYSE\"";
Log.i("CHEOK", data);
final String result = stringCommaPattern.matcher(data).replaceAll("$1");
Log.i("CHEOK", result);

私は得ています

"SAN","Banco Santander, ","NYSE"
"SAN","Banco Santandernull ","NYSE"

このコードをJava SEと同じように動作させるにはどうすればよいですか?


追記:

他のパターンでも同じ結果が得られます。Androidは不一致グループに null 文字列を使用し、Java SE は不一致グループに空の文字列を使用しているようです。

次のコードを取ります。

public static void main(String[] args) {
    // Used to remove the comma within an integer digit. The digit must be located
    // in between two string. Replaced with $1.
    //
    // digitPattern will change
    // ",100,000,"
    // to
    // ",100000,"        
    final Pattern digitPattern = Pattern.compile("(\",)|,(?=[\\d,]+,\")");
    String data = "\",100,000,000,\"";
    System.out.println(data);
    final String result = digitPattern.matcher(data).replaceAll("$1");
    System.out.println(result);
}

Java SE

",100,000,000,"
",100000000,"

アンドロイド

",100,000,000,"
",100null000null000,"
4

1 に答える 1

3

理由ではありませんが、回避策として、appendReplacement使用するのではなく、自分でループを実行できますreplaceAll

StringBuffer result = new StringBuffer();
Matcher m = digitPattern.matcher(data);
while(m.find()) {
  m.appendReplacement(result, (m.group(1) == null ? "" : "$1"));
}
m.appendTail(result);

これは、JavaSE と Android の両方で動作するはずです。

または、正規表現を変更して問題を完全に回避します

Pattern commaNotBetweenQuotes = Pattern.compile("(?<!\"),(?!\")");
String result = commaNotBetweenQuotes.matcher(data).replaceAll("");

ここで、正規表現は、変更したいコンマだけに一致し、そのまま残したいコンマには一致し""ないため、グループをキャプチャする必要なく、すべてを置き換えることができます。

于 2013-03-29T09:17:31.930 に答える