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

2022-09-03 18:33:18

我需要编写一个正则表达式来查找匹配的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系统中都有效的通用正则表达式?


答案 1

能解决问题吗?Pattern.quote(File.separator)

编辑:这是从Java 1.5或更高版本开始可用的。对于 1.4,您需要简单地转义文件分隔符 char:

"\\" + File.separator

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


答案 2

有没有办法使用在Windows和UNIX系统中都有效的通用正则表达式?

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

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

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