使用正则表达式从 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(即最后一次出现&lt;&gt; 中的所有内容)。

【问题讨论】:

【参考方案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 中的每个&lt;item&gt;,该数组在一个元素数组中包含&lt;&gt; 之间的文本(因为当与包含捕获组的正则表达式一起使用时, scan 创建一个包含每个匹配项的捕获的数组)。 last 为您提供最后一个数组,first 然后为您提供其中的字符串。

【讨论】:

【参考方案3】:

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

在单词周围允许空格(但不能保留):

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

或者没有空格:

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

【讨论】:

我不确定最后一个 &lt;&gt; 实际上是否需要成为字符串中的最后一个。如果例如字符串foo &lt;bar&gt; 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 中的字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 ruby​​ 和正则表达式从字符串中提取键值对

使用正则表达式从 mysql 列中提取子字符串

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

正则表达式无法从字符串中提取双参数子字符串

在普通bash中使用正则表达式提取子字符串

如何使用 JavaScript 正则表达式提取字符串?