在Ruby中如何从字符串中提取子字符串?
示例:
String1 = "<name> <substring>"
我想从String1
中提取子字符串
(即在最后一次出现的<
和>
之间的所有内容)。
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
如果我们只需要一个结果,则无需使用scan
。当我们拥有Ruby的String[regexp,#]
时,就不需要使用Python的match
了。str [regexp,capture] -> new_str or nil
String1.scan(/<([^>]*)>/).last.first
scan
创建一个数组,对于 String1
中的每个 <item>
,它包含在一个元素数组中的 <
和 >
之间的文本(因为当与包含捕获组的正则表达式一起使用时,scan 会创建一个包含每个匹配的捕获结果的数组)。last
给出这些数组中的最后一个,然后 first
给出其中的字符串。
你可以很容易地使用正则表达式来实现这个目的...
允许单词周围有空格(但不保留它们):
str.match(/< ?([^>]+) ?>\Z/)[1]
或者不允许空格的情况下:
str.match(/<([^>]+)>\Z/)[1]
<>
是否真的需要是字符串中的最后一件事。如果允许使用字符串 foo <bar> baz
(并且应该得到结果 bar
),那么这种方法将无法实现。 - sepp2k以下是稍微更加灵活的方法,使用 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"
String1.scan(/<(\S+)>/).last