Extracción de expresiones regulares

Aquí está la cadena de entrada:

loadMedia('mediacontainer1', 'http://www.something.com/videos/JohnsAwesomeVideo.flv', 'http://www.something.com/videos/JohnsAwesomeCaption.xml', '/videos/video-splash-image.gif)

Con esta expresión regular: \ '. +. xml \'

... obtenemos esto:

'mediacontainer1', 'http://www.something.com/videos/JohnsAwesomeVideo.flv', 'http://www.something.com/videos/JohnsAwesomeCaption.xml'

... pero quiero extraer solo esto:

http://www.something.com/videos/JohnsAwesomeCaption.xml

¿Alguna sugerencia? Estoy seguro de que este problema se ha planteado antes, pero es difícil de buscar. Estaré encantado de aceptar una solución.

¡Gracias!

preguntado el 16 de mayo de 11 a las 18:05

¿Qué sabor de expresión regular es este? -

4 Respuestas

Si desea obtener todo entre comillas que comience con http:

(?<=')http:[^']+(?=')

Si solo quieres los que terminan en .xml

(?<=')http:[^']+\.xml(?=')
  • No selecciona las comillas (como preguntaste)
  • ¡Es rápido!

Advertencia justa: solo funciona si el motor de expresiones regulares que está utilizando puede manejar la búsqueda hacia atrás

contestado el 16 de mayo de 11 a las 23:05

Traté de estudiar su solución para poder entenderla, pero no estoy seguro del signo =. ¿Qué hace? Algunos sitios populares de RegEx que he comprobado no mencionan el signo = en absoluto. Gracias. - línea de barra

Es parte de la sintaxis de mirar atrás: (? <=). Está cubierto bastante bien aquí: regular-expressions.info/lookaround.html - Thomas Hupkens

Sería útil conocer el idioma. Básicamente, tiene un problema porque el cuantificador + es codicioso, lo que significa que coincidirá con la mayor parte de la cadena que pueda. necesita utilizar un cuantificador no codicioso, que coincidirá lo menos posible.

Necesitaremos saber el lenguaje en el que se encuentra para saber cuál debería ser la sintaxis del cuantificador no codicioso.

Aquí hay una receta de perl.. Solo como nota al margen, en lugar de. +, Probablemente desee hacer coincidir [^.] +. Xml.

\'.+?.xml\'

debería funcionar si su idioma admite expresiones regulares similares a perl.

contestado el 16 de mayo de 11 a las 22:05

Seleccioné la otra respuesta, pero su información aún resultó útil y aprendí codicioso versus no codicioso. Me ayudará a escribir expresiones regulares en el futuro. Salud. El lenguaje es Java / JSP por cierto. Estamos usando la biblioteca de etiquetas JSP "transformText" (que se encuentra en www.infoglue.org, un CMS basado en Java como Drupal, etc.). No estoy seguro de si eso es estilo Perl. - línea de barra

me alegro de que haya ayudado! ¡Entender a los codiciosos frente a los no codiciosos (a veces llamado "tacaño") le evitará muchos problemas de depuración en el futuro! - Paul Sanwald

Esto debería funcionar (probado en javascript, pero bastante seguro de que funcionaría en la mayoría de los casos)

'[^']+?\.xml'

busca estas reglas

  • comienza con '
  • es seguido por cualquier cosa , pero '
  • termina en .xml'

puedes probarlo en http://RegExr.com?2tp6q

contestado el 16 de mayo de 11 a las 22:05

Esto también funcionó. Acepté la otra respuesta porque quería que el resultado no incluyera las comillas. Voto a favor de todos modos. Salud. - línea de barra

en .net esta expresión regular me funciona:

\'[\w:/.]+\.xml\'

descomponiéndolo:

  • un personaje
  • seguido de un carácter de palabra o ':' o '/' o '.' cualquier número de veces (que coincide con el bit de URL)
  • seguido de '.xml' (que diferencia la cadena buscada de las otras URL que coincidirá sin esto)
  • seguido de otro 'personaje

Lo probé aquí

Editar Me perdí que no desea las comillas en el resultado, en cuyo caso, como se ha señalado, debe usar mirar hacia atrás y mirar hacia adelante para incluir las comillas en la búsqueda, pero no en la respuesta. de nuevo en .net:

(?<=')[\w:/.]+\.xml(?=')

pero creo que la mejor solución es una combinación de las que ya se ofrecen:

(?<=')[^']+\.xml(?=')

que parece el más sencillo de leer, al menos para mí.

contestado el 16 de mayo de 11 a las 23:05

Ha mezclado el escape de los puntos: elimine la barra invertida dentro de la clase de personaje, agregue uno antes del punto final. - Tim Pietzcker

@Tim ambas variaciones funcionan en la entrada dada, pero tiene razón sobre la barra invertida antes del punto final, ya que queremos que sea explícitamente un punto - Sam Holder

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.