0

我有一个这样的字符串:“im@ -33.870816,151.203654” 我想提取包括连字符在内的两个数字。我试过这个:

mystring = "im@ -33.870816,151.203654"
/\D*(\-*\d+\.\d+),(\-*\d+\.\d+)/.match(mystring)

这给了我:

33.870816,151.203654

我如何获得连字符?

我需要在红宝石中做到这一点

编辑:我应该澄清一下,“im@”只是一个例子,数字之前可以有任何字符集。这些数字大多用逗号组成。我在使用连字符 (-) 时遇到问题

Edit2:请注意,这两个数字是纬度,经度。这种模式大多是固定的。但是,理论上,前面的字符串可以是任意的。我不希望它没有。或连字符,但你永远不知道。

4

3 回答 3

3

这个怎么样?

arr = "im@ -33.2222,151.200".split(/[, ]/)[1..-1]

而 arr 是["-33.2222", "151.200"], (使用split 方法)。

现在

arr[0].to_f-33.2222arr[1].to_f151.2

编辑:按照评论中的建议,用 [1..-1] 剥离“im@”部分。

EDIT2:此外,无论第一个字符是什么,这项工作都有效。

于 2013-01-28T13:01:53.947 回答
2

如果要使用连字符捕获两个数字,可以使用此正则表达式:

> str = "im@ -33.870816,151.203654"
> str.match(/([\d.,-]+)/).captures
=> ["33.870816,151.203654"]

编辑:现在它捕获连字符。这个单独捕获每个数字:http ://rubular.com/r/NNP2OTEdiL

注意:在这种情况下,使用String#scan将匹配给定模式的 所有出现

> str.scan /\b\s?([-\d.]+)/
=> [["-33.870816"], ["151.203654"]] # Good, but flattened version is better
> str.scan(/\b\s?([-\d.]+)/).flatten
=> ["-33.870816", "151.203654"]

我建议你玩一下Rubular。还有一些关于 Ruby 正则表达式的文档:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html#UJ
http://www.regular-expressions.info/ruby.html
http://www.ruby-doc.org/ core-1.9.3/Regexp.html

于 2013-01-28T13:02:52.757 回答
0

您的正则表达式不起作用,因为连字符被 捕获\D,因此您必须对其进行修改以仅捕获正确的字符集。

[^0-9-]*将是一个不错的选择。

于 2013-01-28T12:58:11.243 回答