RegEx для группы захвата не распознан
У меня есть следующее регулярное выражение:
(?:\/(?<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.
Я смог воспроизвести это, запустив шаблон Regex на https://regex101.com/.
Если вы введете следующую тестовую строку:
/sitecore/content/Corporate-New/home/employer-resources/back-up-care
Вы заметите, что получите только одну именованную группу захвата - path
,
Почему root
не возвращается?
Похоже, что я использую правильный синтаксис для именованной группы захвата. Я пытался добавить скобки как вне группы захвата, так и внутри шаблона регулярных выражений, но ни одна из них не сработала. Я думал, может быть, шаблон Regex не был понят.
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]+\/?)+)
Это немного сложнее, но ближе к тому, чего вы пытались достичь.