我在Rails 3应用程序中收到一条JSON帖子。然后我解析每个值并将它们插入应用程序数据库。这一切都运行良好但现在我想在将它们插入数据库之前修改接收的值。
:subject => email_payload['subject']
如上面的代码所示,我将“subject”的接收值插入名为“subject”的列中。
在上面的例子中,收到的值是这样的:
Results from Example Company - Surname/Firstname/[12345]
我想做的是除了[]之间的数值之外的所有内容。因此,插入数据库的值就是:
12345
我可以,大概只选择0-9中的任何内容,但如何将正则表达式添加到收到的字符串中?
以下任何一项似乎都不起作用:
['subject.gsub!([0-9])']
['subject'.gsub!([0-9])]
['subject'].gsub!([0-9])
我在这里测试了正则表达式http://rubular.com/r/AVFkm3A440
答案 0 :(得分:3)
由于您将.gsub()
应用于散列键email_payload['subject']
返回的值,因此该方法在结束]
之外属于链接。
您的正则表达式缺少其/
分隔符。要整体捕获该群组,请在+
中添加/[^0-9]+/
。 ^
将匹配所有非数字字符,然后.gsub()
将用空字符串替换它们。因此,下面的模式将改变键email_payload['subject']
到位
email_payload['subject'] = 'Results from Example Company - Surname/Firstname/[12345]'
email_payload['subject'].gsub!(/[^0-9]+/, '')
>> "12345"
# gsub!() has mutated the value:
puts email_payload['subject']
>> 12345
答案 1 :(得分:2)
来自Ruby documentation for String的示例:
"hello".gsub(/[aeiou]/, '*') #=> "h*ll*"
"hello".gsub(/([aeiou])/, '<\1>') #=> "h<e>ll<o>"
"hello".gsub(/./) {|s| s.ord.to_s + ' '} #=> "104 101 108 108 111 "
"hello".gsub(/(?<foo>[aeiou])/, '{\k<foo>}') #=> "h{e}ll{o}"
'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*') #=> "h3ll*"
因此gsub用于在字符串上全局替换模式。
您可能需要scan
。
"Results from Example Company - Surname/Firstname/[12345]".
scan(/\[(\d*)\]$/).
flatten
>> ["12345"]
这假定您要选择的数字位于[]
括号内,而]
位于字符串的末尾。