Как я могу сделать это регулярное выражение проверки URL менее жадным? - PullRequest
1 голос
/ 06 сентября 2011

Итак, у меня есть следующее регулярное выражение:

https?://(www\.)?flickr\.com/photos/(.+)/?

Для сопоставления со следующим URL:

http://www.flickr.com/photos/username/

Как я могу остановить включение последней косой черты (/) в под-шаблон имени пользователя (.+)?

Я пытался:

https?://(www\.)?flickr\.com/photos/(.+?)/?

Но тогда он совпадает только с первой буквой имени пользователя.

Ответы [ 5 ]

3 голосов
/ 06 сентября 2011
https?://(?:www\.)?flickr\.com/photos/([^/]+)/?

Я добавил ?: в первую группу, чтобы она не захватывала, затем использовал [^/] вместо точки в последнем совпадении.Это гарантирует вам, что все между "фотографиями /" и последующим "/" захвачено.

Если вам нужно захватить первое www, просто используйте это:

https?://(www\.)?flickr\.com/photos/([^/]+)/?
2 голосов
/ 06 сентября 2011

Вы должны убедиться, что он не совпадает с косой чертой:

https?://(?:www\.)?flickr\.com/photos/([^/]+)/?

Вы также можете сделать регулярное выражение ленивым (что, как я полагаю, вы делали с синтаксисом (.+?)), но приведенное выше будет работать просто отлично

1 голос
/ 06 сентября 2011

Обычно есть два способа сделать это:

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

Исключить символ, которому вы хотите соответствовать следующийЕсли вы хотите остановиться на /, используйте [^/]*.

1 голос
/ 06 сентября 2011

Измените (.+) на ([^/]+).Это будет совпадать до тех пор, пока не встретится /, поэтому вы, возможно, захотите бросить и другие вещи в классе.

0 голосов
/ 06 сентября 2011

Если вы знаете, что будет косая черта, уберите финальный ?.

...