在scala.util.matching.Regex trait MatchData我看到支持群名,我认为这与(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支持的命名捕获组?如果是这样的话有什么例子吗?
答案 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"));
}
}
Bond, James
这里发生的是在Regex
的构造函数中,我们为组1,2等提供别名。然后我们可以通过这些名称来引用这些组。这些名称在模式本身并不是固有的。
答案 1 :(得分:2)
Scala没有自己的正则表达式匹配的实现。相反,底层正则表达式是Java,因此编写模式的细节是java.util.regex.Pattern中记录的那些。
在那里,您会发现您使用的语法实际上是后视约束的语法,但根据文档,<
必须跟=
(正面后瞻) )或!
(负面观察)。