0

我知道原始字符串可以声明为:

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

或者

val foo: String = raw"foo"

但是,如果我有一个字符串类型 val,我怎样才能将它转换为 raw?例如:

// 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 */
}
4

1 回答 1

1

在您的简单情况下,您可以这样做:

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

对于更通用的解决方案,请使用Apache commons 中的StringEscapeUtils.escapeJava

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

注意:您的代码实际上没有任何意义。除了无效的 Scala 语法这一事实之外String toBeMatched ,您的正则表达式模式设置为仅匹配 string "foo",而不匹配"foo\n"or "foo\\n",并且pattern(res)仅在您的正则表达式试图捕获某些内容时才有意义,而事实并非如此。

也许(?!)你的意思是这样的?:

def regexFoo(toBeMatched: String) = {
  val pattern = """foo(.*)""".r
  val pattern(res) = toBeMatched.replace("\n", "\\n") 
}
regexFoo("foo\n")  //  "\\n"
于 2014-08-03T22:14:06.757 回答