Ignorar un sufijo opcional con una expresión regular codiciosa
-
07-07-2019 - |
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?
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.