无法识别捕获组的 RegEx
RegEx for capturing group not recognized
我有以下正则表达式:
(?:\/(?<root>family-resources|employer-resources|newsroom|text-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
如您所见,我正在尝试设置两个命名的捕获组 - root
和 path
。但是,当 运行 这并检查匹配组时,没有 root
组 - 只有 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
没有被返回?
看来我对命名捕获组使用了正确的语法。我试过在捕获组外和正则表达式模式内添加括号,但都没有用。我在想也许 Regex 模式没有被理解。
试试这个正则表达式:
(?:.*\/(?<root>family\-resources|employer\-resources|newsroom|text\-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
我在每个 -
前面添加了一个 anti-slash 因为它们是保留的,并且在开头添加了一个 .*
以接受第一组之前的任何路径。
(?: )
要求括号之间的所有内容都在 non-captured 组中。 .*
允许路径的开头匹配模式。否则,遇到的第一个斜杠将匹配并停止解析(在 sitecore)。
另一个解决方案是使用 look-behind:
(?<=\/)(?<root>family\-resources|employer\-resources|newsroom|text\-pages)?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
这稍微高级一些,但更接近您尝试实现的目标。
我有以下正则表达式:
(?:\/(?<root>family-resources|employer-resources|newsroom|text-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
如您所见,我正在尝试设置两个命名的捕获组 - root
和 path
。但是,当 运行 这并检查匹配组时,没有 root
组 - 只有 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
没有被返回?
看来我对命名捕获组使用了正确的语法。我试过在捕获组外和正则表达式模式内添加括号,但都没有用。我在想也许 Regex 模式没有被理解。
试试这个正则表达式:
(?:.*\/(?<root>family\-resources|employer\-resources|newsroom|text\-pages))?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
我在每个 -
前面添加了一个 anti-slash 因为它们是保留的,并且在开头添加了一个 .*
以接受第一组之前的任何路径。
(?: )
要求括号之间的所有内容都在 non-captured 组中。 .*
允许路径的开头匹配模式。否则,遇到的第一个斜杠将匹配并停止解析(在 sitecore)。
另一个解决方案是使用 look-behind:
(?<=\/)(?<root>family\-resources|employer\-resources|newsroom|text\-pages)?\/(?:(?<path>[0-9A-z=\-\s]+\/?)+)
这稍微高级一些,但更接近您尝试实现的目标。