Mi patrón de expresiones regulares se parece a
<xxxx location="file path/level1/level2" xxxx some="xxx">
Solo me interesa la parte de las cotizaciones asignadas a la ubicación. ¿No debería ser tan fácil como a continuación sin el codicioso interruptor?
/.*location="(.*)".*/
No parece funcionar
Respuestas:
Debe hacer que su expresión regular no sea codiciosa, ya que de forma predeterminada
"(.*)"
coincidirá con todos"file path/level1/level2" xxx some="xxx"
.En cambio, puede hacer que su estrella de punto no sea codiciosa, lo que hará que coincida con la menor cantidad de caracteres posible:
Agregar
?
a un cuantificador (?
,*
o+
) lo hace no codicioso.fuente
.*?
ser.\{-}
para una coincidencia no codiciosa.location="(.*)"
coincidirá desde el "despuéslocation=
hasta el" después, asome="xxx
menos que lo haga no codicioso. Por lo tanto, usted necesita.*?
(es decir, hacerlo no codicioso) o mejor reemplazarlo.*
con[^"]*
.fuente
.*?
notación es más general que[^"]*
Qué tal si
Esto evita la búsqueda ilimitada con. * Y coincidirá exactamente con la primera cita.
fuente
Utilice la coincidencia no codiciosa, si su motor lo admite. Añade el ? dentro de la captura.
fuente
El uso de cuantificadores perezosos
?
sin bandera global es la respuesta.P.ej,
Si tuviera una bandera global
/g
entonces, habría coincidido con todas las coincidencias de menor longitud como se muestra a continuación.fuente
Porque estas usando subpatrón cuantificado y como se describe en Perl Doc ,
Por lo tanto, para permitir que su patrón cuantificado haga una coincidencia mínima, sígalo
?
:fuente
Aquí hay otra forma.
Aquí está el que quieres. Esto es vago
[\s\S]*?
El primer elemento:
[\s\S]*?(?:location="[^"]*")[\s\S]*
reemplazar con:$1
Explicación : https://regex101.com/r/ZcqcUm/2
Para completar, esto obtiene el último. Esto es codicioso
[\s\S]*
El último elemento:
[\s\S]*(?:location="([^"]*)")[\s\S]*
reemplazar con:$1
Explicación : https://regex101.com/r/LXSPDp/3
Solo hay 1 diferencia entre estas dos expresiones regulares y esa es la
?
fuente