显然我仍然不明白它是如何运作的......
这是我的问题:我正在尝试匹配字符串中的数字,例如:
910 -6.258000 6.290
该字符串应该给我一个这样的数组:
[910, -6.2580000, 6.290]
而字符串
blabla9999 some more text 1.1
不应该匹配。
我正在尝试使用的正则表达式是
/([-]?\d+[.]?\d+)/
但它没有做到这一点。有人能帮助我吗?
如果答案可以澄清在匹配中使用括号,那将是很好的。
答案 0 :(得分:2)
括号有不同的含义。
[]
定义了一个字符类,这意味着一个字符匹配,这是该类的一部分
()
正在定义一个捕获组,括号中该部分匹配的字符串将被放入变量中。
您没有定义任何锚点,因此您的模式将匹配您的第二个字符串
blabla9999 some more text 1.1
^^^^ here ^^^ and here
也许这更像是你想要的
^(\s*-?\d+(?:\.\d+)?\s*)+$
^
将模式锚定到字符串的开头,将$
锚定到结尾。
它允许数字前后的空格\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]