12

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

4

5 回答 5

14

行得通吗Pattern.quote(File.separator)

编辑:这在 Java 1.5 或更高版本中可用。对于 1.4,您需要简单地转义文件分隔符字符:

"\\" + File.separator

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

于 2008-10-28T10:32:10.783 回答
6

有什么方法可以使用在 Windows 和 UNIX 系统中都可以使用的通用正则表达式?

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

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

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

于 2008-10-28T15:08:07.277 回答
2

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

pattern = Pattern.compile(
     "^(.+?)\\" + 
     File.separator +
     "js\\" +
     File.separator +
     "(.+?).js$" );
于 2008-10-28T10:33:02.043 回答
1

你为什么不逃跑File.separator

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

符合Pattern.compile要求?我希望将“/”(unix 大小写)作为单个“/”处理。

于 2008-10-28T10:34:44.193 回答
0

我已经在 Unix 系统上测试了 gimel 的答案 -"\\" + File.separator效果很好 - 结果"\/"模式正确匹配单个"/"

于 2008-10-28T10:45:12.330 回答