考虑诸如
之类的路径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 等平台上安全地执行此操作吗?
答案 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)