首页 > 解决方案 > 在 Scala 中通过 Regex 模式匹配提取字符串的重复部分

问题描述

我有这段代码用于提取:正则表达式的重复分离部分,它没有给我正确的输出。

val pattern = """([a-zA-Z]+)(:([a-zA-Z]+))*""".r

for (p <- pattern findAllIn "it:is:very:great just:because:it is") p match {

     case pattern("it", pattern(is, pattern(very, great))) => println("it: "+ is + very+ great)

     case pattern(it, _,rest) => println( it+" : "+ rest)

     case pattern(it, is, very, great) => println(it +" : "+ is +" : "+ very +" : " + great)

     case _ => println("match failure")
   }

我究竟做错了什么?

如何编写允许我提取正则表达式的每个:分隔部分的casepattern表达式?

解决这个问题的正确语法是什么?

如何匹配从正则表达式中提取的未知数量的参数?

在这种情况下打印:

it : is : very : great

just : because : it

is

标签: regexscalapattern-matching

解决方案


您不能像那样使用重复捕获组,它只会将最后捕获的值保存为当前组值。

您仍然可以使用\b[a-zA-Z]+(?::[a-zA-Z]+)*\b正则表达式获得所需的匹配,然后将每个匹配拆分为:

val text = "it:is:very:great just:because:it is"
val regex = """\b[a-zA-Z]+(?::[a-zA-Z]+)*\b""".r
val results = regex.findAllIn(text).map(_ split ':').toList
results.foreach { x => println(x.mkString(", ")) }
// => it, is, very, great
//    just, because, it
//    is

请参阅Scala 演示正则表达式详细信息

  • \b- 单词边界
  • [a-zA-Z]+- 一个或多个 ASCII 字母
  • (?::[a-zA-Z]+)*- 零次或多次重复
    • :- 一个冒号
    • [a-zA-Z]+- 一个或多个 ASCII 字母
  • \b- 单词边界

推荐阅读