【问题标题】:Extract the repetitive parts of a String by Regex pattern matching in Scala在 Scala 中通过 Regex 模式匹配提取字符串的重复部分
【发布时间】:2021-08-05 11:24:10
【问题描述】:

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

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

我做错了什么?

如何编写一个 case 表达式来提取 : 的每个 pattern 正则表达式的分隔部分?

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

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

在这种情况下打印:

it : is : very : great

just : because : it

is

【问题讨论】:

  • 你不能这样重复捕获组,它只会将最后一次捕获的值保存为当前组值。
  • @WiktorStribiżew 谢谢。 this 方法呢?不过,我无法让它工作。
  • 也许只是val results = """\b[a-zA-Z]+(?::[a-zA-Z]+)*\b""".r.findAllIn(text).toList

标签: regex scala pattern-matching


【解决方案1】:

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

您仍然可以使用 \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 demo正则表达式详细信息

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

【讨论】:

  • 非常感谢。这是在做这项工作。我只是不明白你为什么使用这个正则表达式模式而不是我在问题中写的更简单的模式。我错过了什么吗?
  • @user221678 单词边界只匹配整个单词(仅当不粘到其他单词字符时)。如果您不需要,请删除 \bs。非捕获组(?:...) 是正则表达式中的最佳实践,它不会将捕获的子字符串保留在内存中,并且应该在获得匹配后不访问捕获时使用。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 2011-12-10
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多