Ruby中的正则表达式用于识别值类型

时间:2013-12-05 19:43:54

标签: ruby-on-rails ruby regex sinatra

我正在开展一项费用跟踪项目来教我自己的正则表达式,Ruby和Sinatra。现在,我有一个REST路由,通过POST接收一些文本,解析它并将其写入在线电子表格。这是非常基本的,你输入一个数字(里程),一个空间和一个目的地 - 20机场。然后它将20个放在一个单元格中,将“Airport”放在另一个单元格中。我试图让它有点“发烧友”,所以它可以辨别里程和费用。我要做20米机场和30天杂货这样的事情来保持简单。这是我当前代码的片段:

text  = params["Body"]
match = text.match(/^(\S*)(.*)/)

distance    = match[1].to_f
destination = match[2].strip

我想我需要让新的部分看起来像:

text  = params["Body"]
match = text.match(/^([0-9]*)(mMdD)(.*)/)

expamount   = match[1].to_f
exptype     = match[2].strip
expitem     = match[3].strip

我明白了,因为我收到了错误NoMethodError - undefined method [] for nil:NilClass:

任何帮助都将非常感谢...谢谢!

2 个答案:

答案 0 :(得分:0)

你的数据类型匹配器有点过于激进 - (mMdD)应该是(m|M|d|D),这表明任何修饰符都会被接受。这导致不返回匹配,因此当您尝试在结果上查找属性时NoMethodError

答案 1 :(得分:0)

text  = "Body=20m%20Airport"
match = text.match(/([0-9]+)(m|M|d|D){1}%20([a-zA-Z]+)/)

puts match[1].to_f
puts match[2].strip
puts match[3].strip

或者如果您将%20转换为空格

text  = "Body=20m Airport"
match = text.match(/([0-9]+)(m|M|d|D){1}\s([a-zA-Z]+)/)

puts match[1].to_f
puts match[2].strip
puts match[3].strip

如果您不知道,我建议使用Rubular来制定Ruby正则表达式。 顺便说一句,这假设费用项目名称中没有数字或空格。如果您需要,可以将最后一个匹配组更改为[a-zA-Z\d\s]+

相关问题