我使用以下代码收到了一个奇怪的错误。
我有一个类Example
,带有一个伴侣对象,我在其中定义了一个字符串SIGN
。在类Example
中我有一个方法,我创建一个正则表达式,我使用字符串插值,以便我可以使用SIGN
来构建我的正则表达式。
这个编译,但我在运行时遇到一个奇怪的错误。这是Scala的错误吗?我使用的是Scala 2.10.3(在Windows 7上)。
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Example {
import Example._
def regex = s"""$SIGN?\d+""".r
}
object Example {
private val SIGN = """(\+|-)"""
}
// Exiting paste mode, now interpreting.
defined class Example
defined module Example
scala> val e = new Example
e: Example = Example@77c957d9
scala> e.regex
scala.StringContext$InvalidEscapeException: invalid escape character at index 1 in "?\d+"
at scala.StringContext$.treatEscapes(StringContext.scala:229)
at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
at scala.StringContext.standardInterpolator(StringContext.scala:123)
at scala.StringContext.s(StringContext.scala:90)
at Example.regex(<console>:9)
答案 0 :(得分:6)
仔细查看堆栈跟踪后,我看到发生了什么。
您可以看到方法s
在字符串上执行,该字符串处理$SIGN
的替换。该方法遇到字符串中的\d
,显然试图翻译它;查看堆栈跟踪中对treatEscapes
的调用。 treatEscapes
方法无法识别\d
并引发异常。
可以通过在字符串中写\\d
来修复它,但是这会破坏具有三引号字符串的整个目的......
结论:字符串插值和三引号字符串似乎相互干扰。我会说这是一个Scala bug。 (为什么s
方法处理转义?)。
编辑 - 正如Travis Brown在评论中指出的那样,这确实看起来像bug SI-6476。