使用 Go 编程语言的正则表达式查找命名捕获组

2024-01-04

我正在寻找一个正则表达式来查找(其他)正则表达式字符串中的命名捕获组。

示例:我想找到(?P<country>m((a|b).+)n), (?P<city>.+) and (?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使贪婪量词(+ and *) 非贪婪和非贪婪量词 (*?) 贪婪的。详细信息在Go 正则表达式文档 http://code.google.com/p/re2/wiki/Syntax.

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


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

一些现代正则表达式风格确实支持递归(Perl、PCRE)或平衡匹配(.NET),但 Go 不是其中之一(文档明确指出 http://code.google.com/p/re2/wiki/Syntax那个 Perl 的(?R)构造不受支持Go 的正则表达式包似乎基于 RE2 库 http://golang.org/pkg/regexp/#pkg-overview)。您需要构建一个递归下降解析器,而不是正则表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Go 编程语言的正则表达式查找命名捕获组 的相关文章

随机推荐