1

我发现以下正则表达式用于匹配逗号分隔的数字或数字范围:

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

虽然这确实匹配有效字符串,但我只从中得到一个 String,而不是一个字符串列表,每个字符串对应于一个单独的条目。例如

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")
4

1 回答 1

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)
于 2013-05-13T23:40:44.153 回答