我正试图从
开始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 _ => ...
答案 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]")
不过,罗伯特给出了一个很好的警告。确保输入数据没有嵌套,否则您将无法使用正则表达式处理它。如果你有嵌套,你将不得不使用适当的解析器。