2014-03-28 105 views
6

我得到一个奇怪的错误,下面的代码。字符串插值奇怪的错误

我有一个类Example,有一个伴侣对象,其中我定义了一个字符串SIGN。在类Example我有一个方法,我创建一个正则表达式,我使用字符串插值,以便我可以使用SIGN来建立我的正则表达式。

这编译,但我在运行时得到一个奇怪的错误。这是一个斯卡拉错误?我正在使用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 = [email protected] 

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

@ raina77ow这也行不通,我得到同样的例外。 – Jesper

+2

看起来你看到[本期]的某个版本(https://issues.scala-lang.org/browse/SI-6476),也许?简单的旧的“$ SIGN?\\ d +”。r'应该可以正常工作。 –

+0

是的,它适用于\\\'。 – raina77ow

回答

6

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

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

它可以通过在字符串中写\\d是固定的,但违背了三引号字符串的整个目的...

结论:这似乎是字符串插值和三引号字符串井水不犯河水其他。我会说这是一个斯卡拉错误。 (为什么s方法会处理转义?)。

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

+0

很高兴向Scala项目提交一个更好的错误信息(花了1个小时才找到这个小笨蛋)。该消息将给出解决方法,而不是有史以来最好的事情,但会有所帮助... – pommedeterresautee

+0

代码越来越感动了,所以现在应该是提出建议的好时机。但是很难猜测解决方法。也许一个详细的模式来显示正常的字符串转义。 https://github.com/scala/scala/pull/3695 –

+0

@pommedeterresautee看到我的prev评论。另外,SI-6476是相反的问题,人们抱怨说普通的s不支持逃脱的报价。“我猜你想逃避真正的基本的东西,s“”“$ a \ n $ b”“”。奥德斯基说,尽管他有疑问,但这个特征明显胜出,然而人们却对各种边缘案例感到厌恶。 –

相关问题