regex - Scala 正则表达式 : how to return matches as array or list

标签 regex scala

有没有一种简单的方法可以将正则表达式匹配项作为数组返回?
这是我在 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/

相关文章:

javascript - 使用 JavaScript 正则表达式解析查询字符串

scala - 在 Scala 中实现事务方面

scala - 特征的隐式转换

scala - Scala 中的隐式函数。这是如何工作的?

scala - 我的方法与 Predef 中的一致性之间存在隐含歧义的问题

javascript - 文本框中空白、制表符或空格的正则表达式

php - 用于将 BEM 字符串拆分为多个部分的正则表达式模式 (PHP)

regex - 在 Visual Studio Code 中搜索时匹配括号内的字符串

scala - 使用 scala Type 设置类型参数(通过 TypeTag?)

javascript - RegEx 删除所有样式但保留颜色和背景颜色(如果存在)