2009-09-14 12 views
3

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

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

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

+0

Что такое '' (?. +) ''Должно быть? Это недопустимое регулярное выражение. –

+0

@MizardX: Markdown прикрутил регулярное выражение. Я переформатирую, чтобы исправить. –

ответ

3

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

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

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

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

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

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

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

+0

Спасибо, последний работает. Никогда не думал о том, чтобы соответствовать самой конечной линии - я думаю, что это главное отличие. –

+2

Разница в том, что вместо жадного ('. +') Используется ленивый квантификатор ('. *?'). –

+0

Мне нужно их прочитать. Спасибо! –

0

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

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

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

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