Ruby正则表达式

时间:2011-09-12 12:35:16

标签: ruby regex

显然我仍然不明白它是如何运作的......

这是我的问题:我正在尝试匹配字符串中的数字,例如:

     910     -6.258000  6.290

该字符串应该给我一个这样的数组:

[910, -6.2580000, 6.290]

而字符串

  blabla9999 some more text 1.1

不应该匹配。

我正在尝试使用的正则表达式是

/([-]?\d+[.]?\d+)/

但它没有做到这一点。有人能帮助我吗?

如果答案可以澄清在匹配中使用括号,那将是很好的。

4 个答案:

答案 0 :(得分:2)

括号有不同的含义。

[]定义了一个字符类,这意味着一个字符匹配,这是该类的一部分

()正在定义一个捕获组,括号中该部分匹配的字符串将被放入变量中。

您没有定义任何锚点,因此您的模式将匹配您的第二个字符串

blabla9999 some more text 1.1
      ^^^^  here          ^^^ and here

也许这更像是你想要的

^(\s*-?\d+(?:\.\d+)?\s*)+$

here on Regexr

^将模式锚定到字符串的开头,将$锚定到结尾。

它允许数字前后的空格\s和可选的小数部分(?:\.\d+)?这种模式至少匹配一次。

答案 1 :(得分:2)

这是一种有效的模式:

/^[^\d]+?\d+[^\d]+?\d+[\.]?\d+$/

请注意,[^ \ d] +表示至少有一个非数字字符。

第二个想法,这是一个更通用的解决方案,不需要处理正则表达式:

str.gsub(/[^\d.-]+/, " ").split.collect{|d| d.to_f}

示例:

str = "blabla9999 some more text -1.1"

解析:

[9999.0, -1.1]

答案 2 :(得分:2)

可能 /( - ?\ d +(。\ d +)?)+ /

irb(main):010:0> "910     -6.258000  6.290".scan(/(\-?\d+(\.\d+)?)+/).map{|x| x[0]}
=> ["910", "-6.258000", "6.290"]

答案 3 :(得分:0)

str = "    910     -6.258000  6.290"
str.scan(/-?\d+\.?\d+/).map(&:to_f)
# => [910.0, -6.258, 6.29]

如果您不希望将整数转换为浮点数,请尝试以下操作:

str = "    910     -6.258000  6.290"
str.scan(/-?\d+\.?\d+/).map do |ns|
  ns[/\./] ? ns.to_f : ns.to_i
end
# => [910, -6.258, 6.29]