Scala 正则表达式命名捕获组

问题描述 投票:0回答:2

scala.util.matching.Regex Trait MatchData 中,我看到有对组名的支持,我认为这与(Regex Named Capturing Groups)相关

但由于Java在版本7之前不支持组名,据我了解(ref),Scala版本2.8.0(Java HotSpot(TM)64位服务器VM,Java 1.6.给了我这个例外:

scala> val pattern = """(?<login>\w+) (?<id>\d+)""".r
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvio
us maximum length near index 11
(?<login>\w+) (?<id>\d+)
           ^
        at java.util.regex.Pattern.error(Pattern.java:1713)
        at java.util.regex.Pattern.group0(Pattern.java:2488)
        at java.util.regex.Pattern.sequence(Pattern.java:1806)
        at java.util.regex.Pattern.expr(Pattern.java:1752)
        at java.util.regex.Pattern.compile(Pattern.java:1460)

那么问题是 Scala 支持命名捕获组吗?如果有的话有什么例子吗?

regex string scala capturing-group
2个回答
35
投票

恐怕 Scala 的命名组的定义方式不同。它只不过是原始模式中未命名(即仅编号)组的后处理别名。

这是一个例子:

import scala.util.matching.Regex

object Main {
   def main(args: Array[String]) {
      val pattern = new Regex("""(\w*) (\w*)""", "firstName", "lastName");
      val result = pattern.findFirstMatchIn("James Bond").get;
      println(result.group("lastName") + ", " + result.group("firstName"));
   }
}

此打印(如在 ideone.com 上看到的):

Bond, James

这里发生的是,在

Regex
的构造函数中,我们提供组 1、2 等的别名。然后我们可以通过这些名称引用这些组。这些名称并不是模式本身固有的。


3
投票

Scala 没有自己的正则表达式匹配实现。相反,底层正则表达式是 Java 的,因此编写模式的详细信息记录在 java.util.regex.Pattern 中。

在那里你会发现你使用的语法实际上是后向约束的语法,尽管根据文档,

<
后面必须跟有
=
(正向后向)或
!
(消极的后视)。

© www.soinside.com 2019 - 2024. All rights reserved.