字符串插值的奇怪错误

时间:2014-03-28 13:53:19

标签: regex scala string-interpolation

我使用以下代码收到了一个奇怪的错误。

我有一个类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)

1 个答案:

答案 0 :(得分:6)

仔细查看堆栈跟踪后,我看到发生了什么。

您可以看到方法s在字符串上执行,该字符串处理$SIGN的替换。该方法遇到字符串中的\d,显然试图翻译它;查看堆栈跟踪中对treatEscapes的调用。 treatEscapes方法无法识别\d并引发异常。

可以通过在字符串中写\\d来修复它,但是这会破坏具有三引号字符串的整个目的......

结论:字符串插值和三引号字符串似乎相互干扰。我会说这是一个Scala bug。 (为什么s方法处理转义?)。

编辑 - 正如Travis Brown在评论中指出的那样,这确实看起来像bug SI-6476