如何在此字符串中提取此子字符串?

时间:2016-09-30 20:14:05

标签: ruby regex string

我有以下文字:

"Showing1-30\nof 1404results"

我想要提取的是1404

我该怎么做?

我以为我会使用正则表达式来匹配单词ofresults之间的字符串,但不能完全弄清楚如何做到这一点。

还是有另一种方式,比如我可以使用的内置Ruby方法是否有效?

我还在考虑使用split,但间距是关闭的,所以它看起来像这样:

=> ["Showing1-30", "of", "1404results"]

我如何做我想做的事?

4 个答案:

答案 0 :(得分:4)

你可以做到

["Showing1-30", "of", "1404results"].last.to_i

或使用像

这样的正则表达式
/of (\d+)results/

答案 1 :(得分:4)

匹配“of”后跟一个或多个空格,后跟捕获组1中的一个或多个数字,后跟“results”,然后检索捕获组1的内容。

"Showing1-30\nof 1404results"[/of\s+(\d+)results/,1]
  #=> "1404"

匹配以“of”开头的字符串,后跟一个 1 空格(正向lookbehind),然后是“results”(正向前瞻)

"Showing1-30\nof 1404results"[/(?<=of\s)\d+(?=results)/]
  #=> "1404"

匹配“of”后跟一个或多个空格,忘记到目前为止匹配的所有内容(\K),匹配一个或多个数字后跟“结果”(正向前瞻)

"Showing1-30\nof 1404results"[/of\s+\K\d+(?=results)/]
  #=> "1404"

可能需要将第一个正则表达式更改为

/(?<=of\s)\d+\s*(?=results)/

如果有人决定“更正”字符串以便阅读"Showing 1-30\nof 1404 results"[/(?<=of\s)\d+(?=results)/]。 (与其他两个相同。)

1 Ruby的积极外观不能变长;因此,此处不允许\s+

答案 2 :(得分:2)

我使用:

"Showing1-30\nof 1404results"[/(\d+)results/, 1] # => "1404"

"Showing1-30\nof 1404results"不易过度阅读。如果您负责生成它,或者它可能会更改为更具可读性的内容,例如"Showing 1-30\nof 1404 results",那么简单的调整将有所帮助:

"Showing1-30\nof 1404results"[/(\d+)\s*results/, 1] # => "1404"

其中\s*将允许0,1或多个空白字符。

保持正则表达式尽可能简单,直到证明它们需要更复杂。随着复杂性的增加,减慢匹配的可能性增加,这在循环中可能会因长串而变得剧烈。此外,添加导致误报的漏洞的可能性也会增加,这很难调试。

答案 3 :(得分:1)

如果此号码的位置是固定的,则以下是最快的

"Showing1-30\nof 1404results"[-12..-8]

[-12..-8]是一个范围,你可以看到字符串是一个字符数组,并指定从右边开始计数的第8和第12位之间的字符,-1是该行的结尾,-2最后一个角色等。

不是,然后是正则表达式,如

"Showing1-30\nof 14results"[/ \d+/].strip

您查找后跟数字的空格,然后删除前导空格。 这比必须使用捕获组更简单。