在 Go 中查找两个字符串之间的所有字符串

Mys*_*Man 3 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)
}
Run Code Online (Sandbox Code Playgroud)

我的正则表达式显然做错了什么。我正在尝试获取和A B C之间的字符串。Movies:Food:

获取两个字符串之间的所有字符串的正确正则表达式是什么?

Wik*_*żew 6

在Go中,由于其基于RE2regexp不支持lookarounds,因此您需要使用带有函数的捕获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)
Run Code Online (Sandbox Code Playgroud)

请注意,它的使用regexp.QuoteMeta会自动转义左侧和右侧分隔符中的所有特殊正则表达式元字符。

进行跨线匹配并(?s)捕获第 1 组之间和第 1 组中的所有内容。.(.*?)ABCXYZ

所以,在这里你可以使用

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)
Run Code Online (Sandbox Code Playgroud)

请参阅Go 演示。输出:A B C