2015-08-02 3 views
3

Сперва я подумал, что this answer будет полностью решить мою проблему, но это не так.Наименьшее возможное совпадение/nongreedy regex search

У меня есть строка URL, как этот:

http://www.someurl.com/some-text-1-0-1-0-some-other-text.htm#id_76 

Я хотел бы извлечь some-other-text так в основном, я пришел со следующим регулярным выражением:

/0-(.*)\.htm/ 

К сожалению, это соответствует 1-0-some-other-text потому, что регулярное выражение жадные. Мне не удастся сделать это с помощью .*?, это ничего не меняет, как вы можете видеть here.

Я также пробовал с модификатором U, но это не помогло.

Почему «неразветвленный» отзыв не работает?

+0

Вы попробовали '0 - ([^ 0] *) \. Htm'? Если вы не ожидаете, что на вашем входе больше 0, это может решить проблему. –

+0

@stribizhev Регулярное выражение не будет работать, если мой текст является 's0me-text', например. – Delgan

+0

Как насчет ['0- ((?!. * 0-). *) \ .htm'] (https://regex101.com/r/fA7aA1/2), то? Он может работать для отдельных строк. Иначе вам понадобится умеренный жадный токен. –

ответ

3

В случае, если вам нужно, чтобы получить наиболее близкое совпадение, вы можете сделать использование tempered greedy token.

0-((?:(?!0-).)*)\.htm 

См demo

Ленивый версия вашего регулярное выражение не работает, потому что движок регулярных выражений анализирует строку слева направо. Он всегда имеет крайнее левое положение и проверяет, может ли он соответствовать. Итак, в вашем случае он нашел первый 0- и был доволен этим. Лень распространяется на крайнее правое положение. В вашем случае есть 1 возможная крайняя позиция, поэтому ленивое совпадение не может помочь достичь ожидаемых результатов.

Вы также можете использовать

0-((?!.*?0-).*)\.htm 

Это будет работать, если у вас есть отдельные строки для извлечения значения из.

+1

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

0

Вы хотите исключить 1-0? Если да, то вы можете использовать не захват группу:

(?:1-0-)+(.*?)\.htm 

Demo