Ruby:提取第2和第3个fullstops之间的子字符串

时间:2016-01-21 07:27:15

标签: ruby string truncate

我正在Ruby中构建一个程序,它需要在字符串中的第2个和第3个句点之间提取值。

我在网上搜索了各种相关的解决方案,包括截断和之前的Stack-Overflow问题:Get value between 2nd and 3rd comma,但没有回答说明Ruby语言的解决方案。

先谢谢。

2 个答案:

答案 0 :(得分:4)

list = my_string.split(".")
list[2]

我认为这样做。第一个命令将其拆分为一个列表。第二个得到你想要的位

答案 1 :(得分:2)

您可以在full stops(也称为句点)上拆分字符串,但这会创建一个数组,其中每个子字符串在完整停止之前有一个元素。如果该文件有一百万个这样的子串,那将是一种相当低效的方式来获得第三个。

假设字符串是:

mystring =<<_
Now is the time
for all Rubiests
to come to the
aid of their
bowling team.
Or their frisbee
team. Or their
air guitar team.
Or maybe something
else...
_

您可以采取以下几种方法。

#1使用正则表达式

r = /
    (?:      # start a non-capture group
      .*?\.  # match any character any number of times, lazily, followed by a full stop
    ){2}     # end non-capture group and perform operation twice
    \K       # forget everything matched before
    [^.]*    # match everything up to the next full stop
    /xm      # extended/free-spacing regex definition mode and multiline mode

mystring[r]
  #=> " Or their\nair guitar team"

你当然可以写正则表达式:

r = /(?:.*?\.){2}\K[^.]*/m

但扩展形式使其自我记录。

正则表达式引擎将逐步执行字符串,直到找到匹配项或得出结论不匹配为止,然后停在那里。

#2假装句号为新线

首先假设我们正在寻找第三行,而不是第三个子串,然后是一个句号。我们可以写:

mystring.each_line.take(3).last.chomp
  # => "to come to the"

Enumerable#take通过检查由global variable $/保留的输入记录分隔符来确定行何时结束。默认情况下,$/等于换行符。因此,我们可以这样做:

irs = $/  # save old value, normally \n
$/ = '.'
mystring.each_line.take(3).last[0..-2]
  #=> " Or their\nair guitar team"

然后不留下脚印:

$/ = irs

这里String#each_line返回一个枚举器(实际上是一个确定值序列的规则),而不是一个数组。