寫代碼時,要寫這么一個功能:
將包名中的"."換成路徑分隔符("/"或"",視操作系統而定),要求在window或linux下都能正常運行。
分析一下,這明顯是個字符串替換的操作,可用使用String提供的replace方法;換成操作系統指定的路徑分隔符,可以使用File.separator來完成,代碼如下:
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); } }
但運行后,會報錯:
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為"",處理時會被當作轉義字符,后面看這個字符后一位,如果沒有任何內容,就報標題中的異常了。
正確寫法如下:
String path = packageName.replaceAll("\\.", Matcher.quoteReplacement(File.separator));
總結:
以上代碼雖然簡單,但有幾個陷阱在里面:
- 要用
replaceAll()
方法,而不是replace()
; - 包名中的"."在正則中匹配時,要轉義
\\.
,.
在正則表達式中匹配任意一個字符; - windows下
File.separator
為\
,需要Matcher.quoteReplacement(File.separator)
獲取。