ruby从正则表达式中删除可变长度字符串,留下连字符

时间:2013-01-28 12:48:29

标签: ruby

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

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

这给了我:

33.870816,151.203654

如何获得连字符?

我需要在ruby中执行此操作

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

时遇到了麻烦

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

3 个答案:

答案 0 :(得分:3)

这个怎么样?

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

和arr是["-33.2222", "151.200"],(使用split method)。

现在

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

编辑:根据评论中的建议剥离“im @”部分[1 ..- 1]。

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

答案 1 :(得分: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的regegular表达式的文档:

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

答案 2 :(得分:0)

你的正则表达式不起作用,因为连字符被\D捕获,所以你必须修改它才能捕获正确的字符集。

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