Scala中的替换中缺少向后斜杠

时间:2014-09-09 21:08:42

标签: regex string scala

我需要构造一些复杂的字符串,因此我总是使用"""(三引号)作为Scala中字符串和正则表达式的分隔符。

在某些例子中,例如:

"""foo""".r.replaceAllIn("foo", m => """backslash\andsometext""")
// result = """backslashandsometext"""
// where's the backslash?

结果消失了反斜杠。

这是什么原因?包裹在"""中的字符串不应该执行逃避吗?

4 个答案:

答案 0 :(得分:2)

您应该引用替换字符串this way

scala> import util.matching._
import util.matching._

scala> """foo""".r.replaceAllIn("foo", m => Regex quoteReplacement """backslash\andsometext""")
res2: String = backslash\andsometext

反示例:

scala> "f(oo)".r.replaceAllIn("foo", m => """backslash$1\$andsometext""")
res3: String = backslashoo$andsometext

所以美元意味着集团和反斜杠意味着逃避美元。

答案 1 :(得分:1)

  

不应包含在""""""""不要逃避任何事情吗??

这不是真的,反斜杠仍然是转义字符。

scala> """foo""".r.replaceAllIn("foo", m => ("""backslash\\andsometext"""))
res1: String = backslash\andsometext

我认为您可能会误以为\"在三重引号内不起作用。

scala> var str = """test\"123 """
str: String = "test\"123"

答案 2 :(得分:1)

反斜杠本身很特殊,可以作为转义字符。你必须用反斜杠来逃避反斜杠。因此,对于每个单个\)反斜杠,您需要两个反斜杠(\\)。

"""foo""".r.replaceAllIn("foo", m => ("""backslash\\andsometext"""))

答案 3 :(得分:1)

虽然其他人已经发布了一些解决方案而错过了原因,实际上三重引号避免了逃避:

scala> println("""backslash\andsometext""")
backslash\andsometext

但问题是如何实现replaceAllIn,它使用java功能,尤其是Matcher.class和appendReplacement函数,其中包含以下部分:

while (i < paramString.length())
{
  char c = paramString.charAt(i);
  if (c == '\\')
  {
    i++;
    c = paramString.charAt(i);
    localStringBuffer.append(c);
    i++;
  }
  ...

其中paramString是您要替换的字符串,所以即使三引号避免了转义问题,在使用Matcher.class时仍然可以使用它们,因为它逐个字符并跳过斜杠。 / p>

转义斜杠是有效的,因为如果有一个斜杠,它将采用紧接的下一个字符(这是另一个斜杠)并将其附加到StringBuffer