Java 在正则表达式中使用的引号/转义路径
考虑一条路径,例如 var dir=新文件(“c:\test\project1”) 如何在Scala中轻松地转义/引用它,以便在正则表达式中安全地使用它 val extractRelativePath=(dir.getAbsolutePath()+“”(.*)。r 我试着用 dir.getAbsolutePath().replaceAll(“\\”,“\\\”) 但这是行不通的。如下例所示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 =
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(.*)”不知道那里发生了什么,除非您发布了导致此错误的代码。添加了一个最小的可运行示例完全令人惊讶,我自己的尝试甚至都没有成功