java replaceall 用法:處理特殊字元

y_keven發表於2014-04-02
Java程式碼  收藏程式碼
  1. public class TryDotRegEx {  
  2. public static void main(String[] args) {  
  3. // TODO Auto-generated method stub  
  4. String str = "111.3.22.11";  
  5. str=str.replaceAll("(^|\\.)(\\d)(\\.|$)","$100$2$3");  
  6. str=str.replaceAll("(^|\\.)(\\d{2})(\\.|$)","$10$2$3");  
  7. str=str.replaceAll("(^|\\.)(\\d{2})(\\.|$)","$10$2$3");  
  8. str=str.replaceAll("(^|\\.)(\\d{1})(\\.|$)","$100$2$3");  
  9.           
  10. System.out.println(str);  
  11. }  
  12.   
  13. }  

列印結果:111,003,022,011; 

正規表示式,關於String.replaceALL(..)
Java程式碼  收藏程式碼
  1. class t1 {  
  2.        public static void main(String a[]) {  
  3.          String s = 'E:\\jbx\\x9\\io9';  
  4.          String ss;  
  5. //把路徑s中的'\'換為'\\',為何還要整8個'\'?我以為4個就行了。  
  6.          ss = s.replaceAll('\\\\', '\\\\\\\\')  
  7.          System.out.println('s= ' + s);  
  8.          System.out.println('ss=' + ss);  
  9. //output:    
  10. //s= E:\jbx\x9\io9  
  11. //ss=E:\\jbx\\x9\\io9  
  12.        }  
  13. }  

這裡的關鍵是String.replaceAll()是用regular expression 來作為引數的。但是java本身的字串對於轉義符\也有類似的處理。首先,java會把“\\\\”解釋成一個字串(其中包含兩個char)——“\ \”這個就是你在JDK的文件裡看到的。
接下來,由於replaceAll是以正規表示式作為引數,所以“\\”被解釋成一個regex。對於一個regex來說這就代表著一個字元,就是“\”。對後面的那個8個\來說,最終會被解釋成“\\”。 

換言之,假設String.replaceAll()是以普通字串,而不是regex作為引數,那麼這樣寫程式碼: String target = source.replaceAll('\\', '\\\\'); 就可以了。 

=============================== 
在replaceAll(String,String)方法中需要特殊處理英文狀態的括號,在網上找了一下,可以使用下面的寫法將英文括號替換成其他字元(比如中文全形括號):str1.replaceAll("\\(","("); 

Java String replaceAll and regex 
在java中要將一個字串的中$符號去除。我是這樣寫的: 
String tmp = "-$125402.00"; 
tmp.replaceAll("$",""); 
可是執行去來的結果並沒有把$去除。後來找資料才發現要這樣寫 
tmp.replaceAll("\\$","")才可以。 
String replaceAll(String regex, String replacement)中的兩個引數都是regex。尤其是當第二個引數replacement是使用者輸入或指定的字串時,如果其中包含regex特殊字元(主要是\和$)而不加註意,就容易導致問題引發異常。這種情況下如果只是簡單的字串替換而無需regex引擎參與的話,就不要用 replaceAll好了。JDK1.5中加入了String replace(CharSequence target, CharSequence replacement),可以用它。JDK1.4或以下,自己搞一個好了,如oldReplace:http://www.javapractices.com/Topic80.cjp 
     
我在寫程式的時候,需要將"\"字元寫入一個文字檔案,開始以為這不是個什麼問題,轉換一下就好了嘛,程式碼如下: 

targetPath = targetPath.replaceAll("\\", "\\\\"); 
fileOperate.createFile(fileName, targetPath); 


原以為沒有問題,這樣就可以先在讀入的字串中把"\"轉換為"\\",然後在寫入文字檔案時就會寫成"\",沒想到,報如下錯誤: 

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 


回來查了資料才發現,java的replaceAll函式,使用的是正規表示式作為轉換依據,而"\"在正規表示式中也是特殊字元,最後,寫成下面的程式碼才達到了我預想的目的: 

targetPath = targetPath.replaceAll("\\\\", "\\\\\\\\"); 
fileOperate.createFile(fileName, targetPath); 



===================================== 

replace和replaceAll方法的區別: 

主要就是後者是基於規則表達多的替換,而前者是一般的基於字元或字元序列本身的替換。 

比如,可以通過replaceAll("\\d", "*")把一個字串所有的數字字元都換成星號,replace就做不到,因為它不是基於規則表達多的替換。 

相關文章