Pregunta

Estoy realizando una coincidencia de expresiones regulares en .NET contra cadenas que se ven así:

1;#Lists/General Discussion/Waffles Win
2;#Lists/General Discussion/Waffles Win/2_.000
3;#Lists/General Discussion/Waffles Win/3_.000

Necesito hacer coincidir la parte de la URL sin los números al final, para que obtenga esto:

Lists/General Discussion/Waffles Win

Esta es la expresión regular que estoy intentando:

(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*

El problema es que el último grupo se incluye como parte de la coincidencia del grupo medio. También he intentado sin el * al final, pero solo la primera cadena de arriba coincide y no el resto.

Tengo habilitada la opción multilínea. ¿Alguna idea?

¿Fue útil?

Solución

Algunas alternativas diferentes:

@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?
@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
quot;

Esto coincide con la menor cantidad posible de segmentos de ruta, seguido de una última parte opcional y el final de la línea.

@"^\d+;#(.*?)(?:/\d+_\.\d+)?<*>quot;

Esto coincide con tantos segmentos de ruta como sea posible, siempre que no sea la parte de dígitos al final de la línea.

<*>

Esto coincide con la menor cantidad de caracteres posible, seguido de una última parte opcional y el final de la línea.

Otros consejos

Podrías probar

^(\d+;#)([^/]+(/[^\d][^/]*)*)

y obtén el segundo grupo. El primer grupo coincide con 1; # ; el segundo grupo se divide en la primera parte o la URL (se supone que contiene cualquier carácter que no sea /), luego coincide con cualquier número de grupos de /, seguido de un no dígito, seguido de cualquier otra cosa que no sea /.

Probado en este sitio , parece hacer lo que desea. Pruébelo con algunas muestras más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top