首页 > 解决方案 > 在 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:

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

标签: regexgo

解决方案


在 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 组之间的所有内容。.(.*?)ABCXYZ

所以,在这里你可以使用

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


推荐阅读