Конструктор Regex
принимает два аргумента.
new Regex (regex: String, groupNames: String *)
The *Параметр 1010 * является переменным, поэтому он (они) на самом деле является необязательным, и в этом случае его следует оставить пустым, поскольку этот код 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