报价/逃生路径在正则表达式中使用

时间:2012-01-17 10:23:30

标签: java regex scala

考虑诸如

之类的路径
  

var dir = new File(“”“c:\ test \ project1”“”);

我如何轻松地在Scala中转义/引用它,以便它可以在正则表达式中安全使用

  

val extractRelativePath =(dir.getAbsolutePath()+“”“(。*)”“”)。r

我尝试使用

  

dir.getAbsolutePath()。replaceAll(“\\”,“\\\\”);

但这不起作用。如下例所示

def main(args: Array[String]): Unit = {
  var base = new File("""c:\test\project1""");
  val extractRelativePath = (base.getAbsolutePath() + """(.*)""").r

  var dir = new File("""c:\test\project1\somedir""");
  var extractRelativePath(rel) = dir.getAbsolutePath().replaceAll("\\\\", "\\\\")
}

还有一些标准功能可以在 Pattern.quote 等平台上安全地执行此操作吗?

2 个答案:

答案 0 :(得分:2)

您可以使用quotations,但我认为在您的情况下,您还需要转义\E。以下代码应该这样做:

("""\Q""" + base.getAbsolutePath.replaceAll("\\\\E", "\\\\E\\\\\\\\E\\\\Q") + """\E(.*)""").r

我通常会将\E替换为\E\\E\Q,因此我会在引用中拆分引号并明确添加\\后跟E

这是一个小例子。如果我已将base定义为他的:

var base = new File("""c:\test\Earth""");

然后它会产生以下正则表达式:

\Qc:\test\E\\E\Qarth\E(.*)

作为此方法的一个优势,\Q\E将逃避一切,而不仅仅是*\


以下是整个示例代码:

var base = new File("""c:\test\Earth""");
val extractRelativePath = ("""\Q""" + base.getAbsolutePath.replaceAll("\\\\E", "\\\\E\\\\\\\\E\\\\Q") + """\E(.*)""").r

var dir = new File("""c:\test\Earth\somedir""");
var extractRelativePath(rel) = dir.getAbsolutePath

println(rel) // prints: \somedir 

顺便说一下

你也可以使用Pattern.quote,它完全相同,但效率更高:

(Pattern.quote(base.getAbsolutePath) + """(.*)""").r

答案 1 :(得分:1)

看起来很有趣,但它至少应该逃避反斜杠。

replaceAll("\\\\", "\\\\")

但你应该使用的是Pattern.quote。请参阅this question