Regex para que coincida con el final de línea de la URL o el carácter "/"

80

Tengo una URL y estoy tratando de hacerla coincidir con una expresión regular para extraer algunos grupos. El problema que tengo es que la URL puede terminar o continuar con una "/" y más texto de URL. Me gustaría hacer coincidir URL como esta:

Pero no coincide con algo como esto:

Entonces, pensé que mi mejor apuesta era algo como esto:

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

donde la clase de carácter al final contenía el "/" o el final de la línea. Sin embargo, la clase de personaje no parece estar contenta con el "$" allí. ¿Cuál es la mejor forma de discriminar entre estas URL y, al mismo tiempo, retirar los grupos correctos?

Chris Farmer
fuente

Respuestas:

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

1er grupo de captura (.+)

.+ coincide con cualquier carácter (excepto para terminadores de línea)

  • + Cuantificador - Partidos entre uno y un número ilimitado de veces, tantas veces como sea posible, devolviendo según sea necesario (codiciosos)

2do grupo de captura (\d{4}-\d{2}-\d{2})

\d{4}coincide con un dígito (igual a [0-9])

  • {4} Cuantificador : coincide exactamente 4 veces

-coincide con el carácter -literalmente ( distingue entre mayúsculas y minúsculas)

\d{2}coincide con un dígito (igual a [0-9])

  • {2} Cuantificador : coincide exactamente 2 veces

-coincide con el carácter -literalmente ( distingue entre mayúsculas y minúsculas)

\d{2}coincide con un dígito (igual a [0-9])

  • {2} Cuantificador : coincide exactamente 2 veces

-coincide con el carácter -literalmente ( distingue entre mayúsculas y minúsculas)

3er grupo de captura (\d+)

\d+coincide con un dígito (igual a [0-9])

  • + Cuantificador - Partidos entre uno y un número ilimitado de veces, tantas veces como sea posible, devolviendo según sea necesario (codiciosos)

Cuarto grupo de captura (.*)?

? Cuantificador : coincide entre cero y una veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso)

.*coincide con cualquier carácter (excepto para terminadores de línea)

  • * Cuantificador : coincide entre cero e ilimitadas veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso)

$ afirma la posición al final de la cadena

Adam Tegen
fuente
126

Para que coincida con el final o el final del contenido, utilice (/|\z)

Esto solo se aplica si no está utilizando la concordancia de varias líneas (es decir, está haciendo coincidir una única URL, no una lista de URL delimitada por saltos de línea).


Para poner eso con una versión actualizada de lo que tenías:

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

Tenga en cuenta que he cambiado el comienzo para que sea una coincidencia no codiciosa para espacios que no son en blanco ( \S+?) en lugar de coincidir con cualquier cosa ( .*)

Peter Boughton
fuente
6
Como te doy mas punto;) Gracias por esto. Solo para documentar (/ | \ A) coincidiría con la barra inclinada o el comienzo de la cadena.
Senica Gonzalez
Felicitaciones por su nueva insignia Gold Answer;) - ¡Me acabo de dar cuenta de que lo empujé a 100!
random_user_name
63

Ahora tiene un par de expresiones regulares que harán lo que quiera, por lo que está cubierto adecuadamente.

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 ningún significado especial, por lo [/$]partidos, ya sea un literal /o una literales $en lugar de terminar la expresión regular ( /) o coincidente fin de línea ( $).

Dave Sherohman
fuente
8
Esto es algo que se olvida con frecuencia y no se menciona lo suficiente en los documentos de expresiones regulares.
Steve Dunn
6
Tenga en cuenta que ^ puede tener un significado especial en una clase de caracteres. Si es el primer carácter de la clase, lo convierte en una clase negativa que coincidirá con cualquier cosa excepto con los demás caracteres. por ejemplo, para hacer coincidir cualquier cosa excepto a o b, puede usar [^ ab]. Para incluir un ^ literal, solo asegúrese de que no sea el primero, por lo que para hacer coincidir a, bo ^ usaría [ab ^].
David Mason
18

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

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

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

Sparhawk
fuente
2
PHP también por lo que puedo decir. No veo ninguna razón por la $que no pueda usarse entre paréntesis ()en ninguna implementación en realidad. Son los corchetes los []que lo hacen literal.
Joel Mellon
3
$funciona de esta manera en javascript, mientras \zque no (Chrome 48, Firefox 43, IE9).
Vsevolod Golovanov
1
Ésta es la opción más sencilla. Coincidir con barra oblicua o final de línea. ¡Incluso coincide con el título de esta pregunta!
Brett Donald