如何使这个URL验证正则表达式不那么贪婪


How can I make this URL validation regular expression less greedy?

所以我有以下正则表达式:

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

与以下URL匹配:

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

如何阻止最后一个正斜杠(/(包含在用户名子模式(.+)中?

我试过:

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

但是它只匹配用户名的第一个字母。

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

我在第一组中添加了?:,所以它不会被捕获,然后在最后一场比赛中使用[^/]而不是点。这样可以确保"照片/"和下一个"/"之间的所有内容都被捕获。

如果您需要捕获第一个www,只需使用以下内容:

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

您需要确保它不匹配正斜杠:

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

您也可以使regex变得懒惰(我想这就是您在使用(.+?)语法时所做的(,但以上操作将很好地进行

(.+)更改为([^/]+)。这将匹配,直到它遇到/,所以您可能也想在类中抛出一些其他东西。

通常有两种方法:

附加一个问号,使匹配的不贪婪。.*将尽可能多地匹配,.*?将尽可能少地匹配。

排除下一个要匹配的字符。如果要在/上停止,请使用[^/]*

如果您知道后面会有一个斜杠,请取出最后的?