17

scala.util.matching.Regex trait MatchData我看到支持 groupnames ,我认为这与(Regex Named Capturing Groups)有关

但由于Java在我理解的版本 7 之前不支持组名(参考),Scala 版本 2.8.0 (Java HotSpot(TM) 64-Bit Server 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 支持的命名捕获组?如果有的话,有什么例子吗?

4

2 回答 2

33

恐怕 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 等提供了别名。然后我们可以通过这些名称来引用这些组。这些名称不是模式本身固有的。

于 2010-06-12T18:40:53.323 回答
2

Scala 没有自己的正则表达式匹配实现。相反,底层正则表达式是 Java 的,所以编写模式的细节是 java.util.regex.Pattern 中记录的那些。

在那里,您会发现您使用的语法实际上是后视约束的语法,尽管根据文档,<必须后跟=(positive look-behind) 或!(negative look-behind)。

于 2010-06-12T18:37:56.717 回答