使用正则表达式从 Ruby 中的字符串中提取子字符串
Posted
技术标签:
【中文标题】使用正则表达式从 Ruby 中的字符串中提取子字符串【英文标题】:Extract a substring from a string in Ruby using a regular expression 【发布时间】:2011-05-06 03:11:34 【问题描述】:如何从 Ruby 中的字符串中提取子字符串?
例子:
String1 = "<name> <substring>"
我想从String1
中提取substring
(即最后一次出现<
和>
中的所有内容)。
【问题讨论】:
【参考方案1】:"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
如果我们只需要一个结果,则无需使用scan
。
当我们有Ruby的String[regexp,#]
时,不需要使用Python的match
。
见:http://ruby-doc.org/core/String.html#method-i-5B-5D
注意:str[regexp, capture] → new_str or nil
【讨论】:
无需诋毁其他完全有效(我可能认为,更具可读性)的解决方案。 @coreyward,如果它们更好,请争论它。例如,sepp2k 的解决方案更灵活,这就是我在解决方案中指出if we need only one result
的原因。而match()[]
更慢,因为它是两种方法而不是一种。
这是所有方法中最快的,但在我的机器上,即使是最慢的方法也只需要 4.5 微秒。我不在乎推测为什么这种方法更快。在性能上,推测是无用的。只有测量值。
我发现这个解决方案更简单明了(因为我是 Ruby 新手)。谢谢。
@Nakilon 在考虑产品和团队的整体成功时,可读性可以超过微小的性能差异,因此 coreyward 做出了有效的评论。就是说,我认为string[regex]
在这种情况下同样可读,所以这就是我个人使用的。【参考方案2】:
String1.scan(/<([^>]*)>/).last.first
scan
创建一个数组,对于String1
中的每个<item>
,该数组在一个元素数组中包含<
和>
之间的文本(因为当与包含捕获组的正则表达式一起使用时, scan 创建一个包含每个匹配项的捕获的数组)。 last
为您提供最后一个数组,first
然后为您提供其中的字符串。
【讨论】:
【参考方案3】:你可以很容易地使用正则表达式……
在单词周围允许空格(但不能保留):
str.match(/< ?([^>]+) ?>\Z/)[1]
或者没有空格:
str.match(/<([^>]+)>\Z/)[1]
【讨论】:
我不确定最后一个<>
实际上是否需要成为字符串中的最后一个。如果例如字符串foo <bar> baz
是允许的(并且应该给出结果bar
),这是行不通的。
我只是根据他提供的示例字符串。【参考方案4】:
这是一种使用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"
【讨论】:
【参考方案5】:更简单的扫描是:
String1.scan(/<(\S+)>/).last
【讨论】:
以上是关于使用正则表达式从 Ruby 中的字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章