Java 在正则表达式中使用的引号/转义路径

Java 在正则表达式中使用的引号/转义路径,java,regex,scala,Java,Regex,Scala,考虑一条路径,例如 var dir=新文件(“c:\test\project1”) 如何在Scala中轻松地转义/引用它,以便在正则表达式中安全地使用它 val extractRelativePath=(dir.getAbsolutePath()+“”(.*)。r 我试着用 dir.getAbsolutePath().replaceAll(“\\”,“\\\”) 但这是行不通的。如下例所示 def main(args: Array[String]): Unit = { var base =

考虑一条路径,例如

var dir=新文件(“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("\\\\", "\\\\")
}

也没有一些标准功能可以跨平台安全地执行此操作,如模式。引用?。

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

replaceAll("\\\\", "\\\\")
但您应该使用Pattern.quote。请参阅。

您可以使用,但我认为在您的情况下,您还需要退出
\E
。以下代码应该可以做到这一点:

("""\Q""" + base.getAbsolutePath.replaceAll("\\\\E", "\\\\E\\\\\\\\E\\\\Q") + """\E(.*)""").r
我通常将
\E
替换为
\E\\E\Q
,因此我将引号拆分,并在regexp中显式添加
\\
,后跟
E

这里有一个小例子。如果我像他一样定义了
base

var base = new File("""c:\test\Earth""");
然后它将生成以下regexp:

\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 

顺便说一句 您还可以使用
模式。quote
使其完全相同,但效率更高:

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

这导致我的正则表达式失败,出现“java.util.regex.PatternSyntaxException:Unknown character property name{r}靠近索引9 c:\test\project1(.*)”不知道那里发生了什么,除非您发布了导致此错误的代码。添加了一个最小的可运行示例完全令人惊讶,我自己的尝试甚至都没有成功