1

我在 Rails 3 应用程序中收到了 JSON 帖子。然后我解析每个值并将它们插入到应用程序数据库中。一切正常,但现在我想在将接收到的值插入数据库之前对其进行修改。

:subject => email_payload['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

4

2 回答 2

3

由于您将 应用于.gsub()散列键返回的值email_payload['subject'],因此该方法属于在关闭之外链接]

您的正则表达式缺少/分隔符。要捕获整个组,请添加+as in /[^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
于 2012-10-28T13:07:10.487 回答
2

String的 Ruby 文档中的示例:

"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"]

这假定您要选择的数字位于[]括号内,并且]位于字符串的末尾。

于 2012-10-28T13:09:50.693 回答