Regex 构造函数有两个参数。
新的正则表达式(正则表达式:字符串,组名:字符串*)
groupNames 参数是一个可变参数,因此它(它们)实际上是可选的,在这种情况下,它应该留空,因为 groupNames 代码毫无用处。
让我们回顾一下groupNames 应该做什么。我们将在没有groupNames 的情况下开始。
val rx = new Regex("~(A(.)C)~") // pattern with 2 groups, no group names
rx.findAllIn("~ABC~").group(0) //res0: String = ~ABC~
rx.findAllIn("~ABC~").group(1) //res1: String = ABC
rx.findAllIn("~ABC~").group(2) //res2: String = B
rx.findAllIn("~ABC~").group(3) //java.lang.IndexOutOfBoundsException: No group 3
现在是groupNames。
val rx = new Regex("~(A(.)C)~", "x", "y", "z") // 3 groups named
rx.findAllIn("~ABC~").group("x") //res0: String = ABC
rx.findAllIn("~ABC~").group("y") //res1: String = B
rx.findAllIn("~ABC~").group("z") //java.lang.IndexOutOfBoundsException: No group 3
那么为什么sc.parts.tail.map(_ => "x"): _* 这么没用呢?首先是因为创建的名称数量与模式中的组数无关,还因为它对指定的每个名称都使用相同的字符串"x"。该名称仅适用于最后一个命名的组。
val rx = new Regex("~(A(.)C)~", "x", "x") // 2 groups named
rx.findAllIn("~ABC~").group("x") //res0: String = B (i.e. group(2))
...和...
val rx = new Regex("~(A(.)C)~", "x", "x", "x") // 3 groups named
rx.findAllIn("~ABC~").group("x") //java.lang.IndexOutOfBoundsException: No group 3