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="xxxmenos 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
/gentonces, 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:$1Explicació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:$1Explicación : https://regex101.com/r/LXSPDp/3
Solo hay 1 diferencia entre estas dos expresiones regulares y esa es la
?fuente