请注意,findAllIn 不会自动锚定正则表达式模式,而是会在更长的字符串中找到匹配项。如果您只需要允许 17 个字符字符串内的匹配项,您可以使用 match 块,如下所示:
val line = "PE018201804527901"
val regex = """(.{2})(.{4})(.{9})(.{2})""".r
val results = line match {
case regex(g1, g2, g3, g4) => Array(g1, g2, g3, g4)
case _ => Array[String]()
}
// Demo printing
results.foreach { m =>
println(m)
}
// PE
// 0182
// 018045279
// 01
查看Scala demo。
它还可以很好地处理初始化空字符串数组的不匹配场景。
如果您需要获取所有匹配项和所有组,则需要将组抓取到列表中,然后将列表添加到列表缓冲区 (scala.collection.mutable.ListBuffer):
val line = "PE018201804527901%E018201804527901"
val regex = """(.{2})(.{4})(.{9})(.{2})""".r
val results = ListBuffer[List[String]]()
val mi = regex.findAllIn(line)
while (mi.hasNext) {
val d = mi.next
results += List(mi.group(1), mi.group(2), mi.group(3), mi.group(4))
}
// Demo printing
results.foreach { m =>
println("------")
println(m)
m.foreach { l => println(l) }
}
结果:
------
List(PE, 0182, 018045279, 01)
PE
0182
018045279
01
------
List(%E, 0182, 018045279, 01)
%E
0182
018045279
01
见this Scala demo