regex - 在 Go 中查找两个字符串之间的所有字符串
问题描述
我正在努力提取两个字符串之间的多重匹配。
在下面的示例中,我试图A B C
从我的字符串中正则表达式出一个子字符串。
这是我的代码:
package main
import (
"fmt"
"regexp"
)
func main() {
str:= "Movies: A B C Food: 1 2 3"
re := regexp.MustCompile(`[Movies:][^Food:]*`)
match := re.FindAllString(str, -1)
fmt.Println(match)
}
我显然在我的正则表达式中做错了什么。我正在尝试获取andA B C
之间的字符串。Movies:
Food:
获取两个字符串之间的所有字符串的正确正则表达式是什么?
解决方案
在 Go 中,由于其基于 RE2 的regexp
不支持环视,您需要使用具有函数的捕获机制:regexp.FindAllStringSubmatch
left := "LEFT_DELIMITER_TEXT_HERE"
right := "RIGHT_DELIMITER_TEXT_HERE"
rx := regexp.MustCompile(`(?s)` + regexp.QuoteMeta(left) + `(.*?)` + regexp.QuoteMeta(right))
matches := rx.FindAllStringSubmatch(str, -1)
请注意,使用regexp.QuoteMeta
它会自动转义左右分隔符中的所有特殊正则表达式元字符。
跨行匹配并(?s)
捕获第 1 组之间和第 1 组之间的所有内容。.
(.*?)
ABC
XYZ
所以,在这里你可以使用
package main
import (
"fmt"
"regexp"
)
func main() {
str:= "Movies: A B C Food: 1 2 3"
r := regexp.MustCompile(`Movies:\s*(.*?)\s*Food`)
matches := r.FindAllStringSubmatch(str, -1)
for _, v := range matches {
fmt.Println(v[1])
}
}
请参阅Go 演示。输出:A B C
。
推荐阅读
- javascript - 用javascript实现四叉树冲突?
- animation - 如何为 SVG 线路径设置动画?
- python - Raspbian 上的 PyQt5:不显示 QWidgets 的背景颜色
- typescript - 如何使用条件类型来缩小函数体内的类型
- fiware-orion - 我可以部署 FIWARE IDAS 与在 IDAS 不同的虚拟机上运行的 Orion Context Broker 实例进行通信吗?
- html - Flickity 图像不会调整大小,它们会被截断
- heroku - 以 Phoenix 应用程序作为代理运行 Vue 应用程序的正确方法
- typescript - 当 Visual Studio 想要显示 TypeScript 文件时,如何阻止 QtLinguist 启动?
- reactive-programming - 使用项目反应器将验证纳入反应链
- html - 在 html 标签中声明多个类时的优先顺序