我正在开展一项费用跟踪项目来教我自己的正则表达式,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:
任何帮助都将非常感谢...谢谢!
答案 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]+