1

我有以下正则表达式:

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

如您所见,我正在尝试设置两个命名捕获组 -rootpath. 但是,当运行它并检查匹配组时,没有rootgroup-only path

使用 C#:

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

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

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

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

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

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

regex101 结果截图

4

1 回答 1

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]+\/?)+)

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

于 2019-05-09T23:41:09.017 回答