Мой шаблон регулярных выражений выглядит примерно так
<xxxx location="file path/level1/level2" xxxx some="xxx">
Меня интересует только часть в кавычках, привязанных к локации. Разве не должно быть так легко, как показано ниже, без жадного переключателя?
/.*location="(.*)".*/
Кажется, не работает.
Ответы:
Вы должны сделать свое регулярное выражение нежадным, потому что по умолчанию
"(.*)"
будет соответствовать всем"file path/level1/level2" xxx some="xxx"
.Вместо этого вы можете сделать вашу точку-звезду не жадной, чтобы она соответствовала как можно меньшему числу символов:
Добавление
?
на квантификаторе (?
,*
или+
) делает его нежадным.источник
.*?
этого.\{-}
для не жадного совпадения.location="(.*)"
будет соответствовать «послеlocation=
до» после,some="xxx
если вы не сделаете это не жадным. Таким образом, вы либо должны.*?
(т.е. сделать это не жадным), либо лучше заменить.*
на[^"]*
.источник
.*?
запись более общая, чем[^"]*
Как насчет
Это позволяет избежать неограниченного поиска с помощью. * И будет точно соответствовать первой цитате.
источник
Используйте не жадное сопоставление, если ваш движок это поддерживает. Добавить ? внутри захвата.
источник
Использование ленивых квантификаторов
?
без глобального флага - вот ответ.Например,
Если бы у вас был глобальный флаг
/g
, он соответствовал бы всем совпадениям самой низкой длины, как показано ниже.источник
Поскольку вы используете количественный подшаблон и как описано в Perl Doc ,
Таким образом, чтобы разрешить вашему количественному шаблону минимальное совпадение, выполните следующие действия
?
:источник
Вот другой способ.
Вот тот, который вы хотите. Это ленивый
[\s\S]*?
Первый элемент:
[\s\S]*?(?:location="[^"]*")[\s\S]*
заменить на:$1
Объяснение : https://regex101.com/r/ZcqcUm/2
Для полноты, это получает последний. Это жадный
[\s\S]*
Последний элемент:
[\s\S]*(?:location="([^"]*)")[\s\S]*
Заменить на:$1
Объяснение : https://regex101.com/r/LXSPDp/3
Есть только 1 различие между этими двумя регулярными выражениями, и это
?
источник