Цитата / Escape-путь для использования в регулярных выражениях - PullRequest
2 голосов
/ 17 января 2012

Учитывая путь, такой как

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("\\\\", "\\\\")
}

Также нет какой-то стандартной функциональности, которая делает это безопасно на платформах, таких как Pattern.quote ?.

Ответы [ 2 ]

2 голосов
/ 17 января 2012

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

Выглядит смешно, но это должно по крайней мере избежать обратной косой черты.

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

Но вы должны использовать Pattern.quote. См. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...