我收到以下代码的奇怪错误。
我有一个类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)
最佳答案
仔细查看堆栈跟踪后,我知道发生了什么。
可以看到方法s
在字符串上执行,处理 $SIGN
的替换.该方法遇到 \d
在字符串中,显然试图翻译这个;请参阅调用 treatEscapes
在堆栈跟踪中。 treatEscapes
方法无法识别 \d
并抛出异常。
可以通过写 \\d
来修复在字符串中,但这违背了使用三引号字符串的全部目的......
结论:似乎字符串插值和三引号字符串相互干扰。我会说这是一个 Scala 错误。 (为什么 s
方法处理转义?)。
编辑 - 这确实看起来像错误 SI-6476正如 Travis Brown 在评论中指出的那样。
关于regex - 字符串插值的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714793/