Scala преобразует строку в необработанную

Я знаю, что необработанная строка может быть объявлена ​​​​как:

val foo: String = """foo"""

or

val foo: String = raw"foo"

Однако, если у меня есть строковый тип val, как я могу преобразовать его в необработанный? Например:

// val toBeMatched = "line1: foobarfoo\nline2: lol"
def regexFoo(toBeMatched: String) = {
     val pattern = "^.*foo[\\w+]foo.*$".r
     val pattern(res) = toBeMatched  /* <-- this line induces an exception 
       since Scala translates '\n' in string 'toBeMatched'. I want to convert
       toBeMatched to raw string before pattern matching */
}

person SexyNerd    schedule 03.08.2014    source источник


Ответы (1)


В вашем простом случае вы можете сделать это:

val a = "this\nthat"
a.replace("\n", "\\n")  // this\nthat

Для более общего решения используйте StringEscapeUtils.escapeJava в общих ресурсах Apache.

import org.apache.commons.lang3.StringEscapeUtils
StringEscapeUtils.escapeJava("this\nthat")  // this\nthat

Примечание. ваш код на самом деле не имеет никакого смысла. Помимо того факта, что String toBeMatched является недопустимым синтаксисом Scala, ваш шаблон регулярного выражения настроен таким образом, что он будет соответствовать только строке "foo", а не "foo\n" или "foo\\n", а pattern(res) имеет смысл только в том случае, если ваше регулярное выражение пытается что-то захватить, а это не так.

Может быть (?!) вы имели в виду что-то вроде этого?:

def regexFoo(toBeMatched: String) = {
  val pattern = """foo(.*)""".r
  val pattern(res) = toBeMatched.replace("\n", "\\n") 
}
regexFoo("foo\n")  //  "\\n"
person dhg    schedule 03.08.2014