在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

那也没有.如何解决这个问题?

解决方法

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

您在组和[ – ]分隔符之间添加了空格,并且期待空格.正确的模式是:

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

另外,如果你想明确地获得组,那么你想获得一个Match返回.例如,findFirstMatchIn函数返回第一个可选匹配,或者findAllMatchIn返回匹配列表:

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!")
}

我看到你也尝试将字符串解压缩成变量.您必须以下列方式使用正则表达式提取器:

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

如果你想处理错误

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

另外你还可以看一下string interpolation,使你的字符串更容易理解:s“…”

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...