在Scala中使用正则表达式进行分组和模式匹配

时间:2013-11-23 17:04:45

标签: regex scala

我需要使用正则表达式处理电话号码并将它们分组(国家/地区代码)(区号)(号码)。输入格式:

国家/地区代码:1-3位数字之间     ,区号:1-3位数之间     ,数量:4-10位数之间

示例:

1 877 2638277
91-011-23413627

然后我需要打印出这样的组:

CC=91,AC=011,Number=23413627

这是我到目前为止所做的:

String s = readLine
val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r
val ret = pattern.findAllIn(s)
println("CC=" + ret.group(1) + "AC=" + ret.group(2) + "Number=" + ret.group(3));

编译器说“空迭代器”。我也尝试过:

val (cc,ac,n) = s

这也不起作用。如何解决这个问题?

1 个答案:

答案 0 :(得分:26)

问题在于你的模式。我建议使用像RegexPal这样的工具来测试它们。将模式放在第一个文本框中,将提供的示例放在第二个文本框中。它将突出显示匹配的部分。

您在组和[ -]分隔符之间添加了空格,并且期望有空格。正确的模式是:

val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r

此外,如果您想明确获取群组,那么您希望返回Match。例如,findFirstMatchIn函数返回第一个可选MatchfindAllMatchIn返回匹配列表:

val allMatches = pattern.findAllMatchIn(s)
allMatches.foreach { m =>
  println("CC=" + m.group(1) + "AC=" + m.group(2) + "Number=" + m.group(3))
}

val matched = pattern.findFirstMatchIn(s)
matched match {
  case Some(m) =>
    println("CC=" + m.group(1) + "AC=" + m.group(2) + "Number=" + m.group(3))
  case None =>
    println("There wasn't a match!")
}

我看到你也尝试将字符串提取到变量中。您必须按以下方式使用Regex提取器:

val Pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r
val Pattern(cc, ac, n) = s
println(s"CC=${cc}AC=${ac}Number=$n")

如果你想处理错误:

s match {
  case Pattern(cc, ac, n) =>
    println(s"CC=${cc}AC=${ac}Number=$n")
  case _ =>
    println("No match!")
}

另外,您还可以查看string interpolation以便更轻松地理解字符串:s"..."