首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Scala中使用正则表达式进行分组和模式匹配

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

Stack Overflow用户
提问于 2013-11-24 01:04:45
回答 1查看 23.5K关注 0票数 11

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

国家代码: 1-3位,区号: 1-3位,号码: 4-10位

示例:

代码语言:javascript
运行
复制
1 877 2638277
91-011-23413627

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

代码语言:javascript
运行
复制
CC=91,AC=011,Number=23413627

这就是我到目前为止所知道的:

代码语言:javascript
运行
复制
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));

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

代码语言:javascript
运行
复制
val (cc,ac,n) = s

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-24 01:25:30

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

您在组和[ -]分隔符之间添加了空格,而它希望在那里有空格。正确的模式是:

代码语言:javascript
运行
复制
val pattern = """([0-9]{1,3})[ -]([0-9]{1,3})[ -]([0-9]{4,10})""".r

另外,如果您想显式地获取组,那么您需要获取一个返回的Match。例如,findFirstMatchIn函数返回第一个可选的Match,或者findAllMatchIn返回一个匹配列表:

代码语言:javascript
运行
复制
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提取器:

代码语言:javascript
运行
复制
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")

如果你想处理错误:

代码语言:javascript
运行
复制
s match {
  case Pattern(cc, ac, n) =>
    println(s"CC=${cc}AC=${ac}Number=$n")
  case _ =>
    println("No match!")
}

此外,您还可以查看string interpolation以使字符串更易于理解:s"..."

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20165245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档