使用repalceAll 方法出現java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0異常 代碼如下: 以junit測試方式運行後報瞭如下錯誤: java.util.regex.Pattern ...
使用repalceAll 方法出現java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0異常
代碼如下:
1 @Test 2 public void testReplaceAll(){ 3 String sql = "select * from per_handle where id not in('3ce7405509414105a65e7456987e7393')"; 4 String countSql = sql.replaceAll("*", " count(*) "); 5 6 System.out.println(countSql); 7 }
以junit測試方式運行後報瞭如下錯誤:
java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
出現這個錯誤與repalceAll方法有關,查閱java API文檔可以看到 replaceAll方法結構如下:
String java.lang.String.replaceAll(String regex, String replacement)
使用給定的 replacement 替換此字元串所有匹配給定的正則表達式的子字元串。
第一個參數是一個正則表達式,第二個參數為替換後的字元串。
由於"*"在正則表達式中有特殊意義,導致報錯。
嘗試了兩種解決方法:
1、對"*"進行轉義處理,使之成為一個普通字元
1 @Test 2 public void testReplaceAll(){ 3 String sql = "select * from per_handle where id not in('3ce7405509414105a65e7456987e7393')"; 4 String countSql = sql.replaceAll("\\*", " count(*) "); 5 System.out.println(countSql); 6 }
2、使用replace方法代替replaceAll方法
1 @Test 2 public void testReplaceAll(){ 3 String sql = "select * from per_handle where id not in('3ce7405509414105a65e7456987e7393')"; 4 String countSql = sql.replace("*", " count(*) "); 5 System.out.println(countSql); 6 }
這種方法能夠成功的原因是:
String java.lang.String.replace(CharSequence target, CharSequence replacement)
replace方法的第一參數為字元或字元串,所以預設會將"*"當成普通字元串。