Ignorer un suffixe optionnel avec une regex gourmande
-
07-07-2019 - |
Question
J'effectue une correspondance d'expression régulière dans .NET avec des chaînes ressemblant à ceci:
1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000
Je dois faire correspondre la partie de l'URL sans les chiffres à la fin, afin d'obtenir le résultat suivant:
Lists/General Discussion/Waffles Win
C’est la regex que j’essaie:
(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*
Le problème est que le dernier groupe est inclus dans la correspondance du groupe intermédiaire. J'ai aussi essayé sans * à la fin, mais seulement la première chaîne au-dessus correspond et pas le reste.
L'option multiligne est activée. Des idées?
La solution
Quelques alternatives différentes:
@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
quot;
Ceci correspond au moins de segments de chemin possible, suivi d'une dernière partie facultative et de la fin de la ligne.
@"^\d+;#(.*?)(?:/\d+_\.\d+)?<*>quot;
Ceci correspond à autant de segments de chemin que possible, à condition qu'il ne s'agisse pas de la partie chiffre située à la fin de la ligne.
<*>Ceci correspond au moins de caractères possible, suivi d'une dernière partie facultative et de la fin de la ligne.
Autres conseils
Vous pouvez essayer
^(\d+;#)([^/]+(/[^\d][^/]*)*)
et obtenez le 2e groupe. Le premier groupe correspond au 1; #
; le deuxième groupe est divisé en une première partie ou en une URL (supposée contenir un caractère autre que /), puis correspond à un nombre quelconque de groupes de /, suivi d'un caractère non numérique suivi d'un autre caractère que /.
Testé sur le ce site , semble faire ce que vous voulez. Essayez-le avec quelques échantillons supplémentaires.