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

мой шаблон regex выглядит примерно так:

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

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

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

не работает.

5 ответов


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

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

/location="(.*?)"/

добавлять ? на Квантор (?, * или +) делает его не жадным.


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


как о

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

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


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

/location="(.*?)"/

использование ленивых квантификаторов ? без глобального флага-это ответ.

например,

enter image description here

Если бы у вас был глобальный флаг /g тогда он соответствовал бы всем самым низким совпадениям длины, как показано ниже. enter image description here