2008-10-06 31 views
47

Tengo un URL, y estoy intentando hacer coincidirlo con una expresión regular para extraer algunos grupos. El problema que tengo es que la URL puede finalizar o continuar con un "/" y más texto de URL. Me gustaría comparar las URL como esta:Regex para que coincida con el URL de fin de línea o con el carácter "/"

Pero no coincide con algo como esto:

Por lo tanto, pensé que mi mejor apuesta era algo como esto:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$] 

donde la clase de caracteres al final contenía o bien el "/" o la línea de fin de. La clase de personaje no parece estar feliz con el "$" allí. ¿Cómo puedo discriminar mejor entre estas URL mientras sigo retirando los grupos correctos?

Respuesta

37
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$ 
+0

hace este trabajo sin el escape los guiones? – ziggy

85

para que coincida con cualquiera/o al final del contenido, use (/|\z)

Esto sólo se aplica si no se utiliza la concordancia de varias líneas (es decir, que está a juego una única URL, no una lista nueva línea delimitado de URL).


Para poner esto con una versión actualizada de lo que tenía:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z) 

Tenga en cuenta que he cambiado el principio para ser un partido no expansivo para no está en blanco (\S+?) en lugar de a juego cualquier cosa y todo (.*)

+4

¿Cómo puedo darle más puntos;) Gracias por esto. Solo para documentar (/ | \ A) coincidiría con la barra diagonal o el comienzo de la cadena. –

48

Tienes un par de expresiones regulares ahora que harán lo que quieras, para que esté adecuadamente cubierto. Lo que no se ha mencionado es por eso que su intento no funcionará: Dentro de una clase de caracteres, $ (., Así como ^, , y /) no tiene un significado especial, por lo [/ $ ] coincide con un literal / o un literal $ en lugar de terminar la expresión regular (/) o el final de línea coincidente ($).

+5

Esto es algo frecuentemente olvidado y no mencionado en los documentos de expresiones regulares. –

+4

Tenga en cuenta que^puede tener un significado especial en una clase de caracteres. Si es el primer personaje de la clase, lo convierte en una clase negativa que coincidirá con cualquier cosa excepto con los otros personajes. p.ej. para hacer coincidir cualquier cosa excepto aob, podrías usar [^ ab]. Para incluir un literal ^, solo asegúrate de que no sea el primero, así que para unir a, b o^usarías [ab ^]. –

7

En Ruby y Bash, puede usar $ entre paréntesis.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$) 

(Esta solución es similar a Pete Boughton de, pero conserva el uso de $, lo que significa final de la línea, en lugar de utilizar \z, lo que significa final de la cadena.)

+2

PHP también por lo que puedo decir. No veo ninguna razón por la cual '$' no se puede usar entre paréntesis '()' en realidad en ninguna implementación. Son los corchetes '[]' que lo hacen literal. –

+2

'$' funciona de esta forma en javascript, mientras que '\ z' no (Chrome 48, Firefox 43, IE9). –

+1

Esta es la opción más directa. Match slash o final de línea. ¡Incluso coincide con el título de esta pregunta! –

Cuestiones relacionadas