regex - 查找不在另一个文本字符串中的文本?

标签 regex go

假设我有一些带有如下占位符的模板文本:

Message: {{ .response.message }}  
More results: {{ .response.has_more_results }}. 
Results: 
{{range .response.results}}
   Contact name: {{.admin_contact.name.value}}
{{end}}

我想创建一个正则表达式来提取不在 {{range ...}} .... {{end}} 内的占位符部分。所以在上面的例子中,我想得到 .response.message.response.has_more_results .

我想出了以下正则表达式:{{\s?(\.\S*?)\s?}}但这也吸引了 .admin_contact.name.value我想排除。

如何使用正则表达式仅提取 range 之外的占位符部分?

最佳答案

您可以使用与您不需要的匹配的正则表达式模式,并将您需要提取的那些子字符串捕获到第 1 组:

(?s){{range.*?}}.*?{{end}}|{{\s*(\.[^\s{}]+)\s*}}

regex demo

详情
  • (?s){{range.*?}}.*?{{end}} - (?s)启用 .匹配换行符,{{range匹配 {{range , .*?尽可能少地匹配任何 0+ 个字符,然后 {{end}}匹配文字字符串
  • | - 或
  • {{ - {{子串
  • \s* - 0+ 个空格
  • (\.[^\s{}]+) - 第 1 组:一个 .然后是除空格之外的任何 1+ 个字符,{}
  • \s* - 0+ 个空格
  • }} - 一个 }}子串。

  • Go demo :
    package main
    
    import (
        "fmt"
        "regexp"
    )
    
    func main() {
    
        re := regexp.MustCompile(`(?s){{range.*?}}.*?{{end}}|{{\s*(\.[^\s{}]+)\s*}}`)
        str := "Message: {{ .response.message }}  \nMore results: {{ .response.has_more_results }}. \nResults: \n{{range .response.results}}\n   Contact name: {{.admin_contact.name.value}}\n{{end}}"
        for _, match := range re.FindAllStringSubmatch(str, -1) {
        fmt.Printf("%v\n", match[1])
        }
    }
    

    输出:
    .response.message
    .response.has_more_results
    

    关于regex - 查找不在另一个文本字符串中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60713431/

    相关文章:

    go - 包含许多文件的 golang 包的内部组织

    Javascript RegEx - 使用标签之间的文本拆分

    javascript - 从数组中拆分具有多个分隔符的字符串

    regex - 如何在我的整个系统中进行查找和替换?

    java - 负环视正则表达式 - 仅出现一次 - Java

    go - 错误 'zadd'命令的参数数目错误

    javascript - (?=正则表达式) VS (? :regex)

    go - go-swagger自动生成的代码中的 “import cycle not allowed”错误

    unit-testing - golang 这应该是一个集成测试吗?

    docker - 包 X 无法识别的导入路径 : import path does not begin with hostname