Совпадение всех персонажей в группе, кроме первого и последнего вхождения - PullRequest
1 голос
/ 18 июня 2010

Скажите, что я запрашиваю

parent/child/child/page-name

в моем браузере.Я хочу извлечь родителей, детей, а также имя страницы.Вот регулярные выражения, которые я сейчас использую.Не должно быть никаких ограничений относительно количества детей в запросе URL.В настоящее время имя страницы всегда будет в конце и никогда не будет опущено.

^([\w-]{1,}){1} -> Match parent (returns 'parent')
(/(?:(?!/).)*[a-z]){1,}/ -> Match children (returns /child/child/)
[\w-]{1,}(?!.*[\w-]{1,}) -> Match page name (returns 'page-name')

Чем больше я играю с этим, тем больше я чувствую, насколько неуклюже это решение.Это для небольшой CMS, которую я разрабатываю в ASP Classic (:(). Это похоже на пути маршрутизации MVC. Но вместо вызова контроллеров и функций, основанных на запросе URL. Я бы путешествовал по иерархии и находилсоответствующая страница в базе данных. База данных использует модель вложенного набора и связана уникальным именем страницы для каждого дочернего элемента.

Я пробовал использовать функцию split для разделения с помощью символа / delimiter, однако обнаружил, чтовложив столько разделенных операторов вместе, это стало очень нечитаемым.

Все сказали, мне нужен эффективный способ разобрать имя родителя, детей, а также имя страницы в строке. Может кто-нибудь предложить альтернативное решение?

Если честно, я даже не уверен, является ли регулярное выражение лучшим решением моей проблемы.

Спасибо.

1 Ответ

2 голосов
/ 18 июня 2010

Вы можете попробовать использовать:

^([\w-]+)(/.*/)([\w-]+)$

А затем получите доступ к трем соответствующим группам, созданным с помощью Match.SubMatches. Подробнее см. здесь .

EDIT

На самом деле, предполагая, что вы знаете, что [\w-] - это все, что используется в именах деталей, вы можете использовать ^([\w-]+)(.*)([\w-]+)$ вместо этого, и он также будет обрабатывать штраф без дочерних элементов сам по себе.

...