猿问

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

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


Message: {{ .response.message }}  

More results: {{ .response.has_more_results }}. 

Results: 

{{range .response.results}}

   Contact name: {{.admin_contact.name.value}}

{{end}}

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


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


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


尚方宝剑之说
浏览 101回答 1
1回答

冉冉说

您可以使用与您不需要的匹配的正则表达式模式,并将您需要提取的那些子字符串捕获到第 1 组:(?s){{range.*?}}.*?{{end}}|{{\s*(\.[^\s{}]+)\s*}}查看正则表达式演示细节(?s){{range.*?}}.*?{{end}}-(?s)允许 a.匹配换行符,{{range匹配{{range,.*?尽可能少地匹配任何 0+ 字符,然后{{end}}匹配文字字符串|- 或者{{-{{子串\s*- 0+ 个空格(\.[^\s{}]+)- 第 1 组:a .,然后是除空格以外的任何 1+ 个字符,{以及}\s*- 0+ 个空格}}- 一个}}子串。去演示:package mainimport (    "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
随时随地看视频慕课网APP

相关分类

Go
我要回答