有没有一种简单的方法可以将正则表达式匹配项作为数组返回?
这是我在 2.7.7
中尝试的方式:
val s = """6 1 2"""
val re = """(\d+)\s(\d+)\s(\d+)""".r
for (m <- re.findAllIn (s)) println (m) // prints "6 1 2"
re.findAllIn (s).toList.length // 3? No! It returns 1!
但我随后尝试:
s match {
case re (m1, m2, m3) => println (m1)
}
这很好用! m1 为 6,m2 为 1,以此类推。
然后我发现了一些让我更加困惑的事情:
val mit = re.findAllIn (s)
println (mit.toString)
println (mit.length)
println (mit.toString)
那打印:
non-empty iterator
1
empty iterator
“length”调用以某种方式修改了迭代器的状态。这里发生了什么?
最佳答案
好的,首先了解一下findAllIn
返回 Iterator
.安 Iterator
是一个消费一次的可变对象。你对它所做的任何事情都会改变它。如果您不熟悉迭代器,请阅读它们。如果你希望它是可重用的,那么将 findAllIn 的结果转换成 List
,并且仅使用该列表。
现在,您似乎想要所有匹配的组,而不是所有匹配。方法findAllIn
将返回可以在字符串上找到的完整正则表达式的所有匹配项。例如:
scala> val s = """6 1 2, 4 1 3"""
s: java.lang.String = 6 1 2, 4 1 3
scala> val re = """(\d+)\s(\d+)\s(\d+)""".r
re: scala.util.matching.Regex = (\d+)\s(\d+)\s(\d+)
scala> for(m <- re.findAllIn(s)) println(m)
6 1 2
4 1 3
看到有两个匹配项,它们都不包括字符串中间的“,”,因为这不是任何匹配项的一部分。
如果你想要这些组,你可以像这样得到它们:
scala> val s = """6 1 2"""
s: java.lang.String = 6 1 2
scala> re.findFirstMatchIn(s)
res4: Option[scala.util.matching.Regex.Match] = Some(6 1 2)
scala> res4.get.subgroups
res5: List[String] = List(6, 1, 2)
或者,使用
findAllIn
, 像这样:scala> val s = """6 1 2"""
s: java.lang.String = 6 1 2
scala> for(m <- re.findAllIn(s).matchData; e <- m.subgroups) println(e)
6
1
2
matchData
方法将生成 Iterator
返回 Match
而不是 String
.
关于regex - Scala 正则表达式 : how to return matches as array or list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2066170/