scala正则表达式中的多个捕获组

时间:2016-05-26 15:38:47

标签: regex scala

我正试图从

开始
val s: String = "sometextHere[a][b][c]"

val x = "sometextHere"
val y = List("a", "b", "c")

“[...]”的数量是1+。 我有一些非常hacky但我觉得必须有一个更好的解决方案

val bracketMatcher = "\\[(\\w+)\\]".r
val listMatcher = s"^(\\w+)((?:$bracketMatcher)+)".r

listMatcher.findAllIn(chunk) match {
      case matchIterator if matchIterator.hasNext =>
        val matchData = matchIterator.matchData.next()
        val indexesMatch = bracketMatcher.findAllIn(matchData.group(2)).matchData.flatMap(_.subgroups).toList
        val a = matchData.group(1) // This is "sometextHere"
        val b = indexesMatch // This is List("a", "b", "c")
      case _ => ...

1 个答案:

答案 0 :(得分:1)

正则表达式更容易用三引号写。此外,您不必一次匹配整个事物:

def allMatches(s: String): (String, List[String]) = {
  val bracketMatcher = """\[(\w+)\]""".r
  val startMatcher = """^(\w+)\[""".r

  val first = startMatcher.findFirstMatchIn(s).get.group(1)
  val matches = bracketMatcher.findAllMatchIn(s)
  val indexes = matches.map(_.group(1)).toList
  (first, indexes)
}

allMatches("sometextHere[a][b][c]")
不过,罗伯特给出了一个很好的警告。确保输入数据没有嵌套,否则您将无法使用正则表达式处理它。如果你有嵌套,你将不得不使用适当的解析器。