Игнорирование необязательного суффикса с жадным регулярным выражением
-
07-07-2019 - |
Вопрос
Я выполняю сопоставление регулярных выражений в .NET со строками, которые выглядят следующим образом:
1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000
Мне нужно сопоставить часть URL без цифр в конце, чтобы я получил это:
Lists/General Discussion/Waffles Win
Это регулярное выражение, которое я пытаюсь:
(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*
Проблема в том, что последняя группа включается как часть матча средней группы. Я также пробовал без * в конце, но затем совпадает только первая строка, приведенная выше, а не остальные.
У меня включена многострочная опция. Есть идеи?
Решение
Несколько разных альтернатив:
@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
quot;
Это соответствует как можно меньшему количеству сегментов пути, за которым следует необязательная последняя часть и конец строки.
@"^\d+;#(.*?)(?:/\d+_\.\d+)?<*>quot;
Это соответствует как можно большему числу сегментов пути, если только это не цифра в конце строки.
<*>Это соответствует как можно меньшему количеству символов, за которым следует необязательная последняя часть и конец строки.
Другие советы
Вы можете попробовать
^(\d+;#)([^/]+(/[^\d][^/]*)*)
и получите 2-ю группу. Первая группа соответствует 1; #
; вторая группа разбивается на первую часть или URL-адрес (предполагается, что он содержит любой символ, кроме /), затем соответствует любое количество групп /, за которым следует не цифра, а затем что-либо кроме /.
Протестировано на этом сайте , похоже, вы делаете то, что вам нужно. Попробуйте еще несколько образцов.