Ignoriert ein optionales Suffix mit einem gierigen regex
-
07-07-2019 - |
Frage
Ich führe Regex Matching in .NET gegen Strings, die wie folgt aussehen:
1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000
ich brauche, ohne dass die Zahlen am Ende den URL-Abschnitt entsprechen, so dass ich dies:
Lists/General Discussion/Waffles Win
Dies ist die regex Ich versuche:
(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*
Das Problem ist, dass die letzte Gruppe als Teil der mittleren Gruppe Begegnung einbezogen wird. Ich habe auch ohne die * am Ende versucht, aber dann nur die erste Saite über Spiele und nicht um den Rest.
Ich habe die Mehrzeilen-Option aktiviert ist. Irgendwelche Ideen?
Lösung
Ein paar verschiedenen Alternativen:
@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?$"
Das paßt so wenige Pfadsegmente wie möglich, von einem optionalen letzten Teil gefolgt, und das Ende der Zeile.
@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
Das paßt so viele Pfadsegmente wie möglich, solange es nicht der Ziffer-Teil am Ende der Leitung ist.
@"^\d+;#(.*?)(?:/\d+_\.\d+)?$"
Das paßt so wenige Zeichen wie möglich, von einem optionalen letzten Teil gefolgt, und das Ende der Zeile.
Andere Tipps
Sie könnten versuchen,
^(\d+;#)([^/]+(/[^\d][^/]*)*)
und die zweite Gruppe bekommen. Die erste Gruppe entspricht den 1;#
; Die zweite Gruppe wird in den ersten Teil der URL oder gespalten (vorausgesetzt alle Zeichen außer / enthalten), dann wird eine beliebige Anzahl von Gruppen von / entsprechen, durch eine nicht-digit, gefolgt von etwas anderem als /.
Getestet auf dieser Seite scheint zu tun, was Sie wollen. Versuchen Sie es einmal mit etwas mehr Proben.