为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
冉冉说 2021-05-19 17:13:32
我正在寻找一个正则表达式,以在(其他)正则表达式字符串中找到命名的捕获组。例如:我想找到(?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 = `.+` + subGroupsvar postfixedSubGroups string = subGroups + `.+`var surroundedSubGroups string = `.+` + subGroups + `.+`var capturingGroupNameRegex *regexp.RichRegexp = regexp.MustCompile(    `(?U)` +     `\(\?P<.+>` +     `(` +   prefixedSubGroups + `|` + postfixedSubGroups + `|` + surroundedSubGroups + `)` +     `\)`) ?U使贪婪量词(+和*)变得非贪婪,并使非贪婪量词(*?)变得贪婪。Go正则表达式文档中的详细信息。但这不起作用,因为括号未正确匹配。
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-05-24
  • 1 回答
  • 0 关注
  • 320 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信