2010-03-23 20 views
330
patrón

Mi expresiones regulares se ve algo comoExpresión regular para detener al primer partido

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

Sólo estoy interesado en la parte entre comillas asignado a la ubicación. ¿No debería ser tan fácil como a continuación sin el codicioso interruptor?

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

Parece que no funciona.

+0

¿Cuál es su fuente, es HTML o XML o algo? –

+14

¿Por qué es esto una wiki de la comunidad? Es una verdadera pregunta. Muy tarde ahora. –

+0

@Kurresmack Es XML. – publicRavi

Respuesta

686

Debe hacer que su expresión regular no sea codiciosa, porque de manera predeterminada, "(.*)" coincidirá con "file path/level1/level2" xxx some="xxx".

En su lugar puede hacer que su punto-estrella no expansivo, lo que hará que coincida con el menor número de caracteres posible:

/location="(.*?)"/ 

Adición de un ? en un cuantificador (?, * o +) lo hace no -codicioso.

+25

FWIW, en el caso de usar VIM, esta expresión regular debe ser un poco diferente: en lugar de '. *?' Es '. \ {-}' para una coincidencia no codiciosa. – SooDesuNe

+24

Gracias Daniel. ** "Agregar un? En un cuantificador (?, * O +) lo hace no codicioso." ** es un consejo útil para mí. – PhatHV

+5

¿El? describe mi confusión al tratar de resolver esto. Qué apropiado –

11

Use la combinación no codiciosa, si su motor lo admite. Añade el ? dentro de la captura.

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

location="(.*)" coincidirá con el "después location= hasta que el" después some="xxx a menos que sea no expansivo. Por lo tanto, necesita .*? (es decir, no codicioso) o mejor reemplace .* con [^"]*.

+5

+1, '[^"] * "' es más claro que '. *?" 'Cualquier día – Kip

+3

[^"] * también es probablemente más rápido con la mayoría de los motores regex porque no necesita buscar el patrón después del patrón actual . –

+1

@Kip: Probablemente tengas razón, pero la notación '. *?' Es más general que '[^"] * ' – Bondax

20

¿Qué tal

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

Esto evita la búsqueda ilimitada con. * Y coincidirá exactamente con la primera cita.

Cuestiones relacionadas