1

コンマ区切りの数字または数字の範囲に一致する次の正規表現を見つけました。

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

これは有効な文字列と一致しますが、それぞれが区切られたエントリの 1 つに対応する文字列のリストではなく、文字列を 1 つだけ取得します。例えば

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 に答える