用于捕获组的正则表达式无法识别

Posted

技术标签:

【中文标题】用于捕获组的正则表达式无法识别【英文标题】:RegEx for capturing group not recognized 【发布时间】:2019-09-27 20:15:44 【问题描述】:

我有以下正则表达式:

(?:\/(?<root>family-resources|employer-resources|newsroom|text-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)

如您所见,我正在尝试设置两个命名捕获组 - rootpath。但是,在运行此程序并检查匹配组时,没有 root 组 - 只有 path

使用 C#:

root = match.Groups["root"]?.Value ?? "Text Pages"; // Returns an empty string as the root group is missing.

我能够通过在https://regex101.com/ 上运行正则表达式模式来重现这一点。

如果您输入以下测试字符串:

/sitecore/content/Corporate-New/home/employer-resources/back-up-care

你会注意到你只得到一个命名的捕获组 - path。 为什么root 没有被退回?

似乎我对命名捕获组使用了正确的语法。我已经尝试在捕获组之外和正则表达式模式内添加括号,但都没有奏效。我在想也许正则表达式模式没有被理解。

【问题讨论】:

【参考方案1】:

试试这个正则表达式:

(?:.*\/(?<root>family\-resources|employer\-resources|newsroom|text\-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)

我在每个 - 前面添加了一个反斜杠,因为它们是保留的,并且在开头添加了一个 .* 以接受第一组之前的任何路径。

(?: ) 要求括号之间的所有内容都在非捕获组中。 .* 允许路径的开头与模式匹配。否则,遇到的第一个斜杠将匹配并停止解析(在 sitecore)。

另一种解决方案是使用后视:

(?<=\/)(?<root>family\-resources|employer\-resources|newsroom|text\-pages)?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)

这稍微高级一些,但更接近您试图实现的目标。

【讨论】:

成功了,特别是.* 部分。有什么特别的理由需要这样做吗?无论如何,标记为已解决...谢谢! 我添加了一个解释,以及一个替代的、更高级的解决方案。 谢谢!有道理。

以上是关于用于捕获组的正则表达式无法识别的主要内容,如果未能解决你的问题,请参考以下文章

具有多个捕获组的 R 中的正则表达式组捕获

正则表达式:捕获重复捕获组的所有单个实例 [重复]

如何获取正则表达式捕获组的值? [复制]

在 Python 中使用正则表达式识别和捕获文本时遇到问题

正则表达式 c# 获取捕获组的子组

具有捕获组的有效正则表达式,但 sed 脚本不起作用