假设我有一些带有如下占位符的模板文本:
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/