Ищите совпадение URI в этом регулярном выражении, но это сбой тестировщиков регулярных выражений - PullRequest
1 голос
/ 12 февраля 2009

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

^ ([A-Za-Z -]? + /) + $

Если я не ошибаюсь, это должно соответствовать любому URI, который следует этому формату:

некоторые-Ури строка / некоторые-Ури строка / некоторые-Ури строка

Однако я не хочу, чтобы это совпадало:

некоторые-Ури строка / некоторые-Ури строка // некоторый-Ури строка

Обратите внимание на двойную косую черту. По сути, это категория / подкатегория / подкатегория / страница

С любым количеством разрешенных подкатегорий.

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

Проблема в том, что для несоответствующей строки ваш паттерн является патологическим случаем для движка регулярных выражений с возвратом (что справедливо для большинства языков сценариев, таких как Perl, Python и все, что основано на PCRE).

Дополнительная информация:

Вы можете переписать его как:

^([a-zA-Z-]+/)*[a-zA-Z-]+$

Или ваша реализация RE может иметь другие возможности, позволяющие избежать этого сценария.

2 голосов
/ 12 февраля 2009

Посмотрите на катастрофический откат назад ... Вам нужно определить его немного лучше, или написать тот, который разбивает строку URI по одной части за раз ... Этот рекурсивен, и почему он падает на вас ... Или , вы можете изменить его с Greedy на lazy .. На самом деле я не отлаживал это регулярное выражение, но вот что я вижу ...

0 голосов
/ 03 июля 2013
0 голосов
/ 12 февраля 2009

Для PCRE вы можете сделать группу атомарной, чтобы избежать катастрофического возврата. Просто добавьте ?> вот так:

^(?>[a-zA-Z-]+/?)+$

См. Руководство PCRE в разделе «Группировка атомов и пассивные квантификаторы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...