Игнорирование необязательного суффикса с жадным регулярным выражением

StackOverflow https://stackoverflow.com/questions/1422434

Вопрос

Я выполняю сопоставление регулярных выражений в .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-адрес (предполагается, что он содержит любой символ, кроме /), затем соответствует любое количество групп /, за которым следует не цифра, а затем что-либо кроме /.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top