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 正则表达式文档中的详细信息。

但它不起作用,因为括号没有正确匹配。

4

1 回答 1

7

正则表达式无法正确匹配任意嵌套的括号,因为正则语言无法描述任意(递归)嵌套。

一些现代正则表达式风格确实支持递归(Perl,PCRE)或平衡匹配(.NET),但 Go 不是其中之一(文档明确表示,Go 的正则表达式包似乎基于(?R)的 RE2 库不支持Perl 的构造)。您需要构建递归下降解析器,而不是正则表达式。

于 2012-11-11T10:25:54.973 回答