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

Это немного сложнее, но ближе к тому, чего вы пытались достичь.

Другие вопросы по тегам