我有以下文字:
"Showing1-30\nof 1404results"
我想要提取的是1404
。
我该怎么做?
我以为我会使用正则表达式来匹配单词of
和results
之间的字符串,但不能完全弄清楚如何做到这一点。
还是有另一种方式,比如我可以使用的内置Ruby方法是否有效?
我还在考虑使用split
,但间距是关闭的,所以它看起来像这样:
=> ["Showing1-30", "of", "1404results"]
我如何做我想做的事?
答案 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
您查找后跟数字的空格,然后删除前导空格。 这比必须使用捕获组更简单。