【问题标题】:Scala regex Named Capturing GroupsScala 正则表达式命名捕获组
【发布时间】:2011-03-03 01:27:39
【问题描述】:

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

但由于我理解 Java does not support groupnames until version 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 pattern-matching capturing-group


    【解决方案1】:

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

    【讨论】:

    • 谢谢。没有重载的 RichString.r。
    • 这仍然是 Java7 的 scala 2.11 中的行为吗?
    • @javadba 它仍然是。现在你也可以val pattern = """(\w*) (\w*)""".r("firstName", "lastName");
    • @Majki 是的,我已经验证了你所说的。 C'est la vie。
    【解决方案2】:

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

    在那里您会发现您使用的语法实际上是后向约束的语法,但根据文档,&lt; 必须后跟=(正向后视)或@987654323 @(消极的后视)。

    【讨论】:

    • 这是很久以前就应该被标记为错误的东西。尽管它应该抛出异常,但消息应该是“未知的后视组”(显然是预期的),或者更好的是“未知组类型”。当然,作为添加命名组的副作用,它在 JDK 1.7 中已修复。
    • 从 JDK7 开始,这不再是真的——JDK 支持组名,但 scala 不支持。
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2011-03-04
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多