Вы можете использовать цитаты , но я думаю, что в вашем случае вам также нужно экранировать \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