我需要使用正则表达式处理电话号码并将它们分组(国家代码)(区号)(号码).输入格式:
国家代码:1-3位数字,区号:1-3位数,数字:4-10位数
例子:
1 877 2638277
91-011-23413627
Run Code Online (Sandbox Code Playgroud)
然后我需要打印出这样的组:
CC=91,AC=011,Number=23413627
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止:
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));
Run Code Online (Sandbox Code Playgroud)
编译器说"空迭代器".我也尝试过:
val (cc,ac,n) = s
Run Code Online (Sandbox Code Playgroud)
那也不起作用.如何解决这个问题?
Ako*_*chy 27
问题出在你的模式上.我建议使用像RegexPal这样的工具来测试它们.将模式放在第一个文本框中,将提供的示例放在第二个文本框中.它将突出显示匹配的部分.
您在组和[ -]
分隔符之间添加了空格,并且期望在那里有空格.正确的模式是:
val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r
Run Code Online (Sandbox Code Playgroud)
此外,如果您想明确获取组,那么您希望获得Match
返回.例如,findFirstMatchIn
函数返回第一个可选项Match
或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!")
}
Run Code Online (Sandbox Code Playgroud)
我看到你也尝试将字符串提取到变量中.您必须以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")
Run Code Online (Sandbox Code Playgroud)
如果你想处理错误:
s match {
case Pattern(cc, ac, n) =>
println(s"CC=${cc}AC=${ac}Number=$n")
case _ =>
println("No match!")
}
Run Code Online (Sandbox Code Playgroud)
此外,您还可以查看字符串插值,以使您的字符串更容易理解:s"..."