我正在寻找一个正则表达式,以在(其他)正则表达式字符串中找到命名的捕获组。
示例:我想在以下正则表达式中找到(?P<country>m((a|b).+)n)
,(?P<city>.+)
和(?P<street>(5|6)\. .+)
:
/(?P<country>m((a|b).+)n)/(?P<city>.+)/(?P<street>(5|6)\. .+)
我尝试了以下正则表达式来查找命名的捕获组:
var subGroups string = `(\(.+\))*?`
var prefixedSubGroups string = `.+` + subGroups
var postfixedSubGroups string = subGroups + `.+`
var surroundedSubGroups string = `.+` + subGroups + `.+`
var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(
`(?U)` +
`\(\?P<.+>` +
`(` + prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` +
`\)`)
?U
使贪婪的量词(+
和*
)变得非贪婪,而使非贪婪的量词(*?
)变得贪婪。 Go regex documentation中的详细信息。但这不起作用,因为括号未正确匹配。
最佳答案
正则表达式无法正确匹配任意嵌套的括号,因为任意(递归)嵌套都不能用正则语言描述。
一些现代的regex风格确实支持递归(Perl,PCRE)或平衡匹配(.NET),但是Go并不是其中之一(the docs explicitly say不支持Perl的(?R)
构造的RE2 library that Go's regex package appears to be based on)。您需要构建递归下降解析器,而不是正则表达式。
关于regex - 正则表达式使用Go编程语言查找命名的捕获组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13330274/