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

olu*_*ies 16 regex string scala pattern-matching capturing-group

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

但是由于Java在版本7之前不支持组名,因为我理解它(参考),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)
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 26

我担心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"));
   }
}
Run Code Online (Sandbox Code Playgroud)

打印(如ideone.com上所示):

Bond, James
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢.没有重载的RichString.r. (2认同)
  • @javadba它仍然是.现在你也可以做`val pattern ="""(\ w*)(\ w*)""".r("firstName","lastName");` (2认同)