如何使用正则表达式从字符串中提取子字符串?

7

我刚开始学习Ruby中的正则表达式。

字符串看起来像这样:http://www.site.com/media/pool/product_color_purple.jpg,我想从中提取出只包含颜色的部分。这可能是一个可变长度的字符串,因为有些颜色像prince_purple.jpg

所以我有:

colour = c.attr('src').match(/(.*)color_(.*).jpg/)
puts "Colour is #{colour}"

返回的是字符串而不是提取的颜色,这里出了什么问题?

match 返回 MatchData,而 "mtch[0] 等同于特殊变量 $&,返回整个匹配的字符串。mtch[1]、mtch[2] 等返回匹配反向引用的值" - http://www.ruby-doc.org/core/classes/MatchData.html - Jonas Elfström
你的链接已经失效了。最好在这里展示你想要展示的内容。 - sawa
5个回答

14
str="http://www.site.com/media/pool/product_color_purple.jpg"
colour = str.match(/color_([^\/.]*).jpg$/)
puts "Colour is #{colour[1]}"

你没有得到"颜色是紫色",因为match返回的是MatchData,而不是字符串。


3
url="http://www.site.com/media/pool/product_color_purple.jpg"
color = url.scan(/color_(.*).jpg/)[0][0]
#=> purple

或者

url="http://www.site.com/media/pool/product_color_purple.jpg"
color = url.match(/color_(.*).jpg/)[1]
#=> purple

2

不使用正则表达式来举例说明另一种方法

url="http://www.site.com/media/pool/product_color_purple.jpg"
color = url[url.rindex("_")+1..-1].split(".")[0]

对于此问题,我建议仍然使用正则表达式。

color = url.match(/.*_(.*)\./)[1]

0
>> s = %w(http://www.site.com/media/pool/product_color_purple.jpg http://www.site.com/media/pool/product_color_prince_purple.jpg) 
#=> ["http://www.site.com/media/pool/product_color_purple.jpg", "http://www.site.com/media/pool/product_color_prince_purple.jpg"]
>> s.map { |c| c.match(/\w*_color_(\w+).jpg/)[1] } 
#=> ["purple", "prince_purple"]

0
你可以尝试这个正则表达式。
/color_(.*)?.jpg/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接