Meu padrão regex se parece com
<xxxx location="file path/level1/level2" xxxx some="xxx">
Estou interessado apenas na parte entre aspas atribuídas ao local. Não deveria ser tão fácil como abaixo sem a opção gananciosa?
/.*location="(.*)".*/
Não parece funcionar.
Respostas:
Você precisa tornar sua expressão regular não ambiciosa, porque, por padrão,
"(.*)"
corresponderá a todos"file path/level1/level2" xxx some="xxx"
.Em vez disso, você pode tornar sua estrela de ponto não gananciosa, o que fará com que ele corresponda ao mínimo de caracteres possível:
Adicionando a
?
em um quantificador (?
,*
ou+
) torna-o não ganancioso.fonte
.*?
ser.\{-}
para uma correspondência não gananciosa.location="(.*)"
corresponderá do "depoislocation=
até o" depois, asome="xxx
menos que você o torne não ganancioso. Então você precisa.*?
(ou seja, não seja ganancioso) ou melhor substitui-o.*
por[^"]*
.fonte
.*?
notação é mais geral do que[^"]*
E se
Isso evita a pesquisa ilimitada com. * E corresponderá exatamente à primeira cotação.
fonte
Use correspondência não gananciosa, se o seu mecanismo suportar. Adicione o ? dentro da captura.
fonte
O uso de quantificadores preguiçosos
?
sem bandeira global é a resposta.Por exemplo,
Se você tivesse uma bandeira global
/g
, ela corresponderia a todas as correspondências de menor comprimento, conforme abaixo.fonte
Como você está usando sub - padrão quantificado e conforme descrito no Perl Doc ,
Portanto, para permitir que seu padrão quantificado faça a correspondência mínima, siga-o
?
:fonte
Aqui está outra maneira.
Aqui está o que você deseja. Isso é preguiçoso
[\s\S]*?
O primeiro item:
[\s\S]*?(?:location="[^"]*")[\s\S]*
Substitua por:$1
Explicação : https://regex101.com/r/ZcqcUm/2
Para ser completo, esse é o último. Isso é ganancioso
[\s\S]*
O último item:
[\s\S]*(?:location="([^"]*)")[\s\S]*
Substitua por:$1
Explicação : https://regex101.com/r/LXSPDp/3
Há apenas uma diferença entre essas duas expressões regulares e esse é o
?
fonte