使用正则表达式从Ruby中的字符串中提取子字符串

时间:2010-11-06 20:54:46

标签: ruby regex string substring

如何从Ruby中的字符串中提取子字符串?

示例:

String1 = "<name> <substring>"

我想从substring中提取String1(即最后一次出现<>内的所有内容。)

5 个答案:

答案 0 :(得分:285)

"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

如果我们只需要一个结果,则无需使用scan 当我们有match时,无需使用String[regexp,#]

请参阅:http://ruby-doc.org/core/String.html#method-i-5B-5D

注意:str[regexp, capture] → new_str or nil

答案 1 :(得分:115)

String1.scan(/<([^>]*)>/).last.first

scan创建一个数组,对于<item>中的每个String1,都包含单元素数组中<>之间的文本(因为当与包含捕获组的正则表达式一起使用时,scan会创建一个包含每个匹配的捕获的数组。 last为您提供了最后一个数组,first然后为其提供了字符串。

答案 2 :(得分:21)

你可以很容易地使用正则表达式......

允许单词周围的空格(但不保留它们):

str.match(/< ?([^>]+) ?>\Z/)[1]

或者没有允许的空格:

str.match(/<([^>]+)>\Z/)[1]

答案 3 :(得分:9)

使用match方法,这是一种稍微灵活的方法。有了这个,你可以提取多个字符串:

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

答案 4 :(得分:2)

更简单的扫描是:

String1.scan(/<(\S+)>/).last