Scala正则表达式命名为捕获组

时间:2010-06-12 18:17:35

标签: regex string scala pattern-matching capturing-group

scala.util.matching.Regex trait MatchData我看到支持群名,我认为这与(Regex Named Capturing Groups

有关

但是,据我所知Java does not support groupnames until version 7ref), 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支持的命名捕获组?如果是这样的话有什么例子吗?

2 个答案:

答案 0 :(得分:25)

我担心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"));
   }
}

打印(as seen on ideone.com):

Bond, James

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

答案 1 :(得分:2)

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

在那里,您会发现您使用的语法实际上是后视约束的语法,但根据文档,<必须跟=(正面后瞻) )或!(负面观察)。