2013-03-13 114 views
0

我有一个字符串,这是一个函数调用。我想分析它并获得参数:使用正则表达式字符串解析

"add_location('http://abc.com/page/1/','This is the title, it is long',39.677765,-45.4343,34454,'http://abc.com/images/image_1.jpg')" 

它具有总共6个参数,并且是网址,整数和小数的混合物。我无法弄清楚我将使用的拆分方法的正则表达式。请帮忙! 这就是我想出的 - 哪个是错的。

/('(.*\/[0-9]*)',)|([0-9]*,)/ 

回答

2

假设所有非数字的参数在单引号,因为在你的例子

string.scan(/'.+?'|[-0-9.]+/) 
+0

不错的正则表达式!假设,参数是简单的常量 - 无算术运算或方法调用 – 2013-03-13 17:26:20

+0

太好了 - 正是我需要的。非数字参数包含在单引号中。 – bpn 2013-03-13 17:45:38

0

你真的不想用reg-ex解析这个复杂的东西;从长远来看,它不会起作用。我不确定你是否只想解析这一个字符串,或者这个表单中有很多字符串的确切内容不一样。如果您提供关于最终目标的更多信息,则可以获得更详细的帮助。

对于在一般情况下解析这个复杂的事情,您确实希望对字符串进行适当的标记(即词法分析)。在过去的Ruby中,我已经有了使用Citrus的良好体验。这是一个很好的解析复杂令牌/语言的宝石,就像你正在做的那样。你可以找到更多关于它在这里:

https://github.com/mjijackson/citrus

3

对待像一个CSV字符串可能的工作:

require 'csv' 
str = "add_location('http://abc.com/page/1/','This is the title, it is long',39.677765,-45.4343,34454,'http://abc.com/images/image_1.jpg')" 
p CSV.parse(str[13..-2], :quote_char => "'").first 
# => ["http://abc.com/page/1/", "This is the title, it is long", "39.677765", "-45.4343", "34454", "http://abc.com/images/image_1.jpg"]