replace File.separator出現異常:【java.lang.IllegalArgumentException: character to be escaped is missing】

寫代碼時,要寫這麼一個功能:將包名中的"."換成路徑分隔符("/"或"",視操做系統而定),要求在window或linux下都能正常運行。java

分析一下,這明顯是個字符串替換的操做,可用使用String提供的replace方法;換成操做系統指定的路徑分隔符,可使用File.separator來完成,代碼以下:linux

import java.io.File;

public class Test {
    public static void main(String[] args){
        String packageName = "com.xxx.model";
        String path = packageName.replaceAll("\\.", File.separator);
        System.out.println(path);
    }
}

但運行後,會報錯:web

Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
	at java.util.regex.Matcher.appendReplacement(Matcher.java:809)
	at java.util.regex.Matcher.replaceAll(Matcher.java:955)
	at java.lang.String.replaceAll(String.java:2223)
	at com.gop.yy.api.web.Test.main(Test.java:13)

緣由在於,windows下File.separator爲"",處理時會被看成轉義字符,後面看這個字符後一位,若是沒有任何內容,就報標題中的異常了。正則表達式

正確寫法以下:windows

String path = packageName.replaceAll("\\.", Matcher.quoteReplacement(File.separator));

總結:

以上代碼雖然簡單,但有幾個陷阱在裏面:api

  1. 要用replaceAll()方法,而不是replace();
  2. 包名中的"."在正則中匹配時,要轉義\\..在正則表達式中匹配任意一個字符;
  3. windows下File.separator\,須要Matcher.quoteReplacement(File.separator)獲取。
相關文章
相關標籤/搜索