【问题标题】:Multi capturing groups in scala regexscala 正则表达式中的多捕获组
【发布时间】:2016-05-26 15:38:47
【问题描述】:

我正在尝试离开

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

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

“[...]”的数量是 1+。 我有一些很老套的东西,但我觉得必须有更好的解决方案

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 _ => ...

【问题讨论】:

  • 这有可能变得非常混乱。如果您有奇数个方括号和/或顺序错误,和/或在字符串的不同部分,会发生什么情况。即val s: String = "some[[d]x[e]]][[textHere[a][b][c]"
  • 好点,但是在这种情况下,我只对完全匹配此模式的情况感兴趣,任何比这更复杂的(嵌套括号等)都不应该匹配。

标签: regex scala


【解决方案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]")

不过,罗伯特给出了一个很好的警告。确保您的输入数据没有嵌套,否则您将无法使用正则表达式处理它。如果您有嵌套,则必须使用适当的解析器。

【讨论】:

  • 看起来确实好一点,我会接受的,谢谢!
猜你喜欢
  • 2010-12-14
  • 2013-06-12
  • 2023-04-11
  • 2011-03-03
  • 2011-03-04
  • 1970-01-01
  • 2020-01-02
  • 2015-07-24
  • 2018-03-11
相关资源
最近更新 更多