为什么即使我要求它是懒惰的,我的正则表达式似乎也很贪婪?

时间:2015-03-18 10:16:52

标签: ruby regex

我使用的是Ruby 2.1。

我的字符串是"Here's my user profile (http://example.com/user/5316), it's good. :)"

我想在括号中仅捕获URL。

我的第一个努力是/(http:\/\/example.com.*)\)/。 example.com,然后是任何字符,在遇到右括号时结束。但不,这是行不通的。我想,也许这是贪婪的,懒惰会有所帮助。但附加懒惰操作符并没有帮助。我尝试使用[)]代替\),但这也无济于事。我有点难过。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

懒惰的运算符工作正常:

irb> m = "Here's my user profile (http://example.com/user/5316), it's good. :)".match(/(http:\/\/example.com.*?)\)/)
=> #<MatchData "http://example.com/user/5316)" 1:"http://example.com/user/5316">
irb> m[1]
=> "http://example.com/user/5316"

正则表达式应为/(http:\/\/example.com.*?)\)/ - 惰性运算符包含?

答案 1 :(得分:1)

require "uri"

str = "Here's my user profile (http://example.com/user/5316), it's good. :)"
p URI.extract(str)

答案 2 :(得分:0)

使用像[^\s)]*这样的否定字符类,它匹配任何字符但不匹配空格或),零次或多次。

> "Here's my user profile (http://example.com/user/420), it's good. :)".match(/\bhttp:\/\/example\.com\b[^\s)]*/)[0]
=> "http://example.com/user/420"