regex - 在 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
解决方案
您不能像那样使用重复捕获组,它只会将最后捕获的值保存为当前组值。
您仍然可以使用\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
- 单词边界
推荐阅读
- vue.js - 在 vue2-editor 中使用 quill-image-resize-module 不会实现 ImageResize
- java - jasper 报告中未显示数据,但显示元数据
- mysql - 如何从多个 id 的字符串中按 id 选择行
- python - 我的 pygame rects 给出的 rect 参数无效错误
- django - 如何在 Djnago 中从多对多关系表中获取数据?
- terraform - Terraform - 合并顶级资源参数
- javascript - 如何使用 PHP 将 UTF-8 编码为 Unicode 转义序列,如“\u00C1”?
- python - 如何将字符串中的数字转换为每个数字单独的列表
- symfony - 带有额外字段的多对多原则(更新和删除特定项目)
- flutter - Flutter 是否可以在没有 Google Play 服务的情况下工作?