我需要构造一些复杂的字符串,因此我总是使用"""
(三引号)作为Scala中字符串和正则表达式的分隔符。
在某些例子中,例如:
"""foo""".r.replaceAllIn("foo", m => """backslash\andsometext""")
// result = """backslashandsometext"""
// where's the backslash?
结果消失了反斜杠。
这是什么原因?包裹在"""
中的字符串不应该执行否逃避吗?
答案 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
。