正则表达式中的转义路径分隔符

时间:2008-10-28 10:28:16

标签: java regex escaping

我需要编写一个正则表达式来查找匹配

的javascript文件
<anypath><slash>js<slash><anything>.js

例如,它应该适用于:

  • c:\ mysite \ js \ common.js(Windows)
  • /var/www/mysite/js/common.js(UNIX)

问题是Windows中的文件分隔符未正确转义:

pattern = Pattern.compile(
     "^(.+?)" + 
     File.separator +
     "js" +
     File.separator +
     "(.+?).js$" );

投掷

java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence

有没有办法使用适用于Windows和UNIX系统的通用正则表达式?

5 个答案:

答案 0 :(得分:13)

Pattern.quote(File.separator)能做到这一点吗?

编辑:从Java 1.5或更高版本开始提供。对于1.4,您只需要转义文件分隔符char:

"\\" + File.separator

转义标点字符不会破坏任何内容,但无条件地转义字母或数字会将其更改为其特殊含义或导致PatternSyntaxException(感谢Alan M在评论中指出这一点!)

答案 1 :(得分:5)

  

有没有办法使用适用于Windows和UNIX系统的通用正则表达式?

是的,只需使用匹配两种分隔符的正则表达式。

pattern = Pattern.compile(
    "^(.+?)" + 
    "[/\\\\]" +
    "js" +
    "[/\\\\]" +
    "(.+?)\\.js$" );

这是安全的,因为Windows和Unix都不允许文件或目录名中的这些字符。

答案 2 :(得分:2)

你不能像这样使用反斜杠来转义路径分隔符:

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js$" );

答案 3 :(得分:1)

为什么不逃避File.separator

... +
"\\" + File.separator +
...

符合Pattern.compile要求? 我希望“/”(unix case)作为单个“/".

处理

答案 4 :(得分:0)

我在Unix系统上测试了gimel的答案 - 让"\\" + File.separator正常工作 - 模式中生成的"\/"正确匹配单个"/"