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



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

我在网上搜索了各种相关的解决方案,包括截断和之前的 Stack-Overflow 问题:获取第 2 个和第 3 个逗号之间的值,但是没有答案说明 Ruby 语言的解决方案。

提前谢谢。

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

我想那会做到的。第一个命令将其拆分为一个列表。秒得到你想要的位

您可以在句号(也称为句点)上拆分字符串,但这会在句号之前创建一个数组,其中包含每个子字符串的一个元素。如果文档有一百万个这样的子字符串,那将是一种相当低效的方式,只能获得第三个子字符串。

假设字符串为:

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 theirnair guitar team"

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

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

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

正则表达式引擎将单步执行字符串,直到找到匹配项或得出结论认为不可能有匹配项,然后停止到此为止。

#2 假装句号是换行符

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

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

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

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

然后不留下脚印:

$/ = irs

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

相关内容

  • 没有找到相关文章

最新更新