RegEx для группы захвата не распознан - PullRequest
2 голосов
/ 10 мая 2019

У меня есть следующее регулярное выражение:

(?:\/(?<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 не был понят.

regex101 result screenshot

1 Ответ

1 голос
/ 10 мая 2019

Попробуйте с этим регулярным выражением:

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

Я добавил анти-слэш перед каждым -, так как они зарезервированы, и .* в начале, чтобы принять любой путь перед вашей первой группой.

RegEx

(?: ) требует, чтобы все, что находится в скобках, было в незаписанной группе. .* позволяет началу пути соответствовать шаблону. В противном случае первый встреченный слеш будет совпадать и прекратит синтаксический анализ (на sitecore).

Другим решением было бы использование заглядывания:

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

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

...