正则表达式解析逗号分隔的数字范围列表,并在各个组中捕获它们

时间:2013-05-13 23:28:27

标签: regex scala

我找到the following regex来匹配逗号分隔的数字或数字范围:

val reg = """^(\d+(-\d+)?)(,\s*(\d+(-\d+)?))*$""".r

虽然这个匹配有效字符串,但我只得到一个字符串,而不是一个字符串列表,每个对应于其中一个分开的条目。 E.g。

reg.findAllIn("1-2, 3").map(s => s""""$s"""").toList

给出

List("1-2, 3")

但我想:

List("1-2", "3")

以下内容更接近:

val list = "1-2, 3" match {
  case Reg(groups @ _*) => groups
  case _ => Nil
}

list.map(s => s""""$s"""")

但它包含各种'垃圾':

List("1-2", "-2", ", 3", "3", "null")

1 个答案:

答案 0 :(得分:3)

使用findAllIn,您不应该尝试匹配整个字符串。它会被它能找到的最大连续比赛分开。相反,你需要的只是正则表达式的一部分:

val reg = """(\d+(-\d+)?)""".r

如果您将其与findAllIn一起使用,它将返回您需要的内容。

scala> val x = """(\d+(-\d+)?)""".r
x: scala.util.matching.Regex = (\d+(-\d+)?)

scala> x.findAllIn("1-2, 3").toList
res0: List[String] = List(1-2, 3)