Регулярное выражение для остановки при первом совпадении [duplicate]

310

Мой шаблон регулярного выражения выглядит примерно как

<xxxx location="file path/level1/level2" xxxx some="xxx">

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

/.*location="(.*)".*/

Кажется, что не работает.

  • 0
    Каков ваш источник, это HTML или XML или что-то?
  • 17
    Почему это вики сообщества? Это настоящий вопрос. Слишком поздно.
Показать ещё 6 комментариев
Теги:

4 ответа

620
Лучший ответ

Вам нужно сделать свое регулярное выражение неживым, потому что по умолчанию "(.*)" будет соответствовать всем "file path/level1/level2" xxx some="xxx".

Вместо этого вы можете сделать свою точку-звезду неживой, что сделает ее максимально возможной:

/location="(.*?)"/

Добавление ? в квантификатор (?, * или +) делает его неживым.

  • 28
    FWIW, если вы используете VIM, это регулярное выражение должно быть немного другим: вместо .*? это .\{-} для не жадного совпадения.
  • 34
    Спасибо Даниэль. «Добавление? На квантификаторе (?, * Или +) делает его не жадным». полезный совет для меня.
Показать ещё 2 комментария
32

location="(.*)" будет соответствовать "после location= до" после some="xxx, если вы не сделаете его неживым. Поэтому вам либо нужно .*? (т.е. Сделать его неживым), либо лучше заменить .* на [^"]*.

  • 7
    +1, [^"]*" яснее чем .*?" любой день
  • 3
    [^ "] * также, вероятно, быстрее с большинством движков регулярных выражений, потому что ему не нужно искать шаблон после текущего шаблона.
Показать ещё 2 комментария
19

Как насчет

.*location="([^"]*)".*

Это позволяет избежать неограниченного поиска с помощью. * и будет точно соответствовать первой цитате.

  • 0
    Из-за расхождений в grep вышеупомянутый должен быть предпочтительным шаблоном, если переносимость является проблемой.
10

Используйте не-жадное соответствие, если ваш движок поддерживает его. Добавить? внутри захвата.

/location="(.*?)"/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню