从字符串中提取多个数字之一

时间:2014-07-21 09:13:24

标签: ruby regex

我们说我有类似的东西:

{values="99999" name="22222" store="11111"}

使用:

.match(/values="\d+/) 

将返回:

values="99999

我怎样才能得到" 99999"出来的?

我已经尝试了

.match(/values="(\d+)/) 

应该只返回我认为的数字,但它不会。

希望有人可以提供帮助!

干杯,

4 个答案:

答案 0 :(得分:3)

试试这个正则表达式,

.match(/values="(\d+)"/) 

仅对values=之后的数字,您可以使用后视和前瞻

.match(/(?<=values=")(\d+)(?=")/) 

<强>解释

  • (?<=values=")这里使用了Look-behind。它将匹配标记设置在字符串values="
  • 之后
  • (\d+)在正则表达式()中称为捕获组。它捕获一个或多个数字。
  • (?=") Lookahead用于检查数字后面的后续字符是否为双引号。如果它是双引号,则只匹配前面的数字。

答案 1 :(得分:3)

Ruby 2+:使用\K

这样做:

if subject =~ /values="\K\d+/
    match = $&
  • values="匹配文字字符
  • \K告诉引擎放弃到目前为止与其返回的最终匹配项匹配的内容
  • \d+与您的数字匹配

答案 2 :(得分:2)

如果使用.captures方法并查看返回值, 你会找到你需要的东西。

#!/usr/bin/env ruby

string = '{values="99999" name="22222" store="11111"}'
one = string.match(/values="(\d+)/).captures

p one   => ["99999"]

答案 3 :(得分:0)

根据每个人的回答,我还建议添加.to_a.shift,如果找到则会返回找到的值,如果没有则会nil。例如:

.match(/(?<=values=")(\d+)(?=")/).to_a.shift
.match(/values="\K(\d+)/).to_a.shift

执行rescue nil也可能适用,但它有点hacky或不太安全。