我有以下Java SE代码,它在PC上运行
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);
}
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果
"SAN","Banco Santander, ","NYSE"
"SAN","Banco Santander ","NYSE"
Run Code Online (Sandbox Code Playgroud)
但是,来到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);
Run Code Online (Sandbox Code Playgroud)
我越来越
"SAN","Banco Santander, ","NYSE"
"SAN","Banco Santandernull ","NYSE"
Run Code Online (Sandbox Code Playgroud)
任何建议和解决方法,我如何使这些代码的行为与Java SE相同?
其他模式也产生相同的结果.看来,Android正在为无法匹配的组使用空字符串,而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);
}
Run Code Online (Sandbox Code Playgroud)
",100,000,000,"
",100000000,"
Run Code Online (Sandbox Code Playgroud)
",100,000,000,"
",100null000null000,"
Run Code Online (Sandbox Code Playgroud)
不是原因,但作为一种解决方法,您可以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);
Run Code Online (Sandbox Code Playgroud)
这应该适用于 JavaSE 和 Android。
或者通过更改正则表达式来完全回避问题
Pattern commaNotBetweenQuotes = Pattern.compile("(?<!\"),(?!\")");
String result = commaNotBetweenQuotes.matcher(data).replaceAll("");
Run Code Online (Sandbox Code Playgroud)
这里的正则表达式只匹配您想要更改的逗号,而不是您想要保留完整的逗号,因此您可以将它们全部替换为,""而不需要捕获组。
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |