当前位置: 首页 > 面试题库 >

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

陆飞捷
2023-03-14
问题内容

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

例如:我想找到(?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文档
中的详细信息。

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


问题答案:

正则表达式不可能正确匹配任意嵌套的括号,因为任意(html" target="_blank">递归)嵌套都不能用正则语言描述。

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



 类似资料:
  • 本文向大家介绍Go语言正则表达式的使用详解,包括了Go语言正则表达式的使用详解的使用技巧和注意事项,需要的朋友参考一下 正则表达式是一种进行模式匹配和文本操纵的功能强大的工具。正则表达式灵活、易用,按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。 准则 默认是最短匹配,只要字符串满足条件就返回。 如果没有匹配到,都是返回为nil。 如果需要做最长匹配,调

  • 问题内容: 据我所知,JavaScript中没有所谓的捕获组。获得类似功能的替代方法是什么? 问题答案: ECMAScript 2018将命名捕获组引入了JavaScript正则表达式中。 例: 如果您需要支持较旧的浏览器,则可以使用命名捕获组来处理普通(编号)捕获组,而只需要跟踪编号-如果捕获组中的捕获组顺序很麻烦,正则表达式更改。 我能想到的命名捕获组只有两个“结构”优点: 在某些正则表达式中

  • 本文向大家介绍Go语言正则表达式示例,包括了Go语言正则表达式示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言正则表达式。分享给大家供大家参考,具体如下: 返回结果: PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用: JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript 正则表达式在线生成工

  • 主要内容:正则表达式语法规则,Regexp 包的使用正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的字符组合。 Go语言通过 regexp 包为正则表达式提供了官方支持,其采用 RE2 语法,除了 、 外,Go语言和 Perl、 Python 等语言的正则基本一致。 正则表达式语法规则 正则表达式是

  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。