regex - 字符串插值的奇怪错误

标签 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)

最佳答案

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

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

可以通过写 \\d 来修复在字符串中,但这违背了使用三引号字符串的全部目的......

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

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

关于regex - 字符串插值的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714793/

相关文章:

dart - 我可以动态应用 Dart 的字符串插值吗?

scala - 使用 sbt-native-packager 的任何好例子

scala - `contains[BB >: B](e: BB): Boolean` 而不是 `contains(e: Any): Boolean` 的好处

javascript - 正则表达式替代项(所有匹配项)

Python 正则表达式提取第一个大写单词或第一个和第二个单词(如果两者都大写)

c - C 语言中 Scala 的 Option 或 Rust 的 Result 错误处理

aws-lambda - AWS Lambda 字符串插值不起作用

powershell - POST请求变量powershell

regex - R正则表达式提取文本不紧跟模式

regex - Awk:如何处理文件夹和子文件夹中的多个 files.txt?