Как смоделировать не жадные квантификаторы в языках, которые их не поддерживают? - PullRequest
4 голосов
/ 16 января 2010

Рассмотрим это регулярное выражение: <(.*)>

Применительно к этой строке:

<2356> <my pal ned> <!@%@>

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

Для простых случаев, подобных описанным выше, я обошел это ограничение с помощью такого регулярного выражения: <([^>]*)>

Но что можно сделать с помощью такого регулярного выражения? start (.*) end

Применительно к этой строке:

start 2356 end start my pal ned end start !@%@ end

Есть ли какое-либо обращение за помощью?

Ответы [ 2 ]

5 голосов
/ 16 января 2010

Если конечным условием является наличие одного символа, вместо него можно использовать класс отрицательных символов:

<([^>]*)>

Для более сложных случаев, когда конечное условие состоит из нескольких символов, вы можете попробовать использовать отрицательный прогноз, но если ленивое сопоставление не поддерживается, есть вероятность, что запрос также не будет:

((?!end).)*

Ваш последний выход - построить что-то ужасное, как это:

(en[^d]|e[^n]|[^e])*
2 голосов
/ 16 января 2010

Я заменяю . на [^>], где > в этом случае - следующий символ в RE.

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