gpt4 book ai didi

regex - Scala 正则表达式多 block 捕获

转载 作者:行者123 更新时间:2023-12-04 10:59:04 28 4
gpt4 key购买 nike

我正在尝试使用 Scala 中的正则表达式捕获多行字符串的一部分。
输入的形式为:

val input = """some text
|begin {
| content to extract
| content to extract
|}
|some text
|begin {
| other content to extract
|}
|some text""".stripMargin

我已经尝试了几种可能让我摆脱 begin { 的文本。 }块。其中之一:
val Block = """(?s).*begin \{(.*)\}""".r

input match {
case Block(content) => println(content)
case _ => println("NO MATCH")
}

我得到一个 NO MATCH .如果我放弃 \}正则表达式看起来像 (?s).*begin \{(.*)它匹配最后一个块,包括不需要的 }和“一些文字”。我在 rubular.com 上检查了我的正则表达式 /.*begin \{(.*)\}/m它至少匹配一个块。我想当我的 Scala 正则表达式匹配相同时,我可以开始使用 findAllIn匹配所有块。我究竟做错了什么?

我看了 Scala Regex enable Multiline option但我无法捕获所有出现的文本块,例如, Seq[String] .
任何帮助表示赞赏。

最佳答案

Alex已经说过,当使用模式匹配从正则表达式中提取字段时,模式就像是有界的(即,使用 ^$ )。避免此问题的常用方法是使用 findAllIn第一的。这边走:

val input = """some text
|begin {
| content to extract
| content to extract
|}
|some text
|begin {
| other content to extract
|}
|some text""".stripMargin

val Block = """(?s)begin \{(.*)\}""".r

Block findAllIn input foreach (_ match {
case Block(content) => println(content)
case _ => println("NO MATCH")
})

否则,您可以使用 .*在开始和结束时绕过该限制:
val Block = """(?s).*begin \{(.*)\}.*""".r

input match {
case Block(content) => println(content)
case _ => println("NO MATCH")
}

顺便说一句,您可能想要一个非热切的匹配器:
val Block = """(?s)begin \{(.*?)\}""".r

Block findAllIn input foreach (_ match {
case Block(content) => println(content)
case _ => println("NO MATCH")
})

关于regex - Scala 正则表达式多 block 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691002/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com