寫代碼時,要寫這麼一個功能:將包名中的"."換成路徑分隔符("/"或"",視操做系統而定),要求在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
replaceAll()
方法,而不是replace()
;\\.
,.
在正則表達式中匹配任意一個字符;File.separator
爲\
,須要Matcher.quoteReplacement(File.separator)
獲取。