【问题标题】:Escape path separator in a regular expression正则表达式中的转义路径分隔符
【发布时间】:2008-10-28 10:28:16
【问题描述】:

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

【问题讨论】:

    标签: java regex escaping


    【解决方案1】:

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

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

    "\\" + File.separator
    

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

    【讨论】:

    • 太好了,可惜它只在 Java 1.5+ 之后才可用(我仍然需要它在 1.4 中工作)
    • 从 Java 7 开始,您可以使用 FileSystems.getDefault().getSeparator() 代替 File.separator
    • @herau 有区别吗?
    • @Tomalak 在默认提供程序的情况下,此方法返回与 File.separator 相同的分隔符。但是,当您与其他提供商合作时,它会很有用。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我更喜欢这个答案,因为它本机适用于 Windows 和 unix 上的所有类型的正则表达式。例如,在 ant 任务中,您没有像已接受的答案那样的助手。
    • 实际上,我认为 Linux 可以在文件或目录名中间使用 `` (而不是将其解释为与目录有任何关系);它是 usersfilesystems 的一些组合禁止它,AFAIK。 (当然不想要任何具有此类名称的文件或目录。)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你为什么不逃跑File.separator

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2014-07-14
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多