Игнорирование необязательного суффикса с жадным регулярным выражением - PullRequest
3 голосов
/ 14 сентября 2009

Я выполняю сопоставление регулярных выражений в .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+)*

Проблема в том, что последняя группа включается как часть матча средней группы. Я также пробовал без * в конце, но затем совпадает только первая строка выше, а не остальные.

У меня включена многострочная опция. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2009

Несколько разных альтернатив:

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

Это соответствует как можно меньшему количеству сегментов пути, за которым следует необязательная последняя часть и конец строки.

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

Это соответствует как можно большему количеству сегментов пути, если только это не цифра в конце строки.

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

Это соответствует как можно меньшему количеству символов, за которым следует необязательная последняя часть и конец строки.

0 голосов
/ 14 сентября 2009

Вы можете попробовать

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

и получите 2-ю группу. Первая группа соответствует 1;#; вторая группа разбивается на первую часть или URL-адрес (предполагается, что он содержит любой символ, кроме /), затем соответствует любое количество групп /, за которым следует не цифра, а затем что-либо кроме /.

Протестировано на этом сайте , похоже, делает то, что вы хотите. Попробуйте еще несколько образцов.

...