我正在寻找一个正则表达式,以在(其他)正则表达式字符串中找到命名的捕获组。
例如:我想找到(?P<country>m((a|b).+)n),(?P<city>.+)并(?P<street>(5|6)\. .+)在下面的正则表达式:
(?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文档中的详细信息。
?U
+
*
*?
但这不起作用,因为括号未正确匹配。
正则表达式不可能正确匹配任意嵌套的括号,因为任意(递归)嵌套都不能用正则语言描述。
一些现代的regex样式确实支持递归(Perl,PCRE)或平衡匹配(.NET),但是Go并不是其中之一(文档明确指出,Go的regex软件包所基于(?R)的RE2库不支持Perl的构造。上)。您需要构建递归下降解析器,而不是正则表达式。
(?R)