2012-10-28 72 views
1

我正在接收JSON帖子到我的Rails 3應用程序中。然後我解析每個值並將它們插入到應用程序數據庫中。這一切都運行良好,但現在我想在將它們插入數據庫之前修改接收的值。在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

回答

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 
+0

如果我使用'email_payload [ '主題']。GSUB!(/ [^ 0-9] + /, '')'有來自覆蓋了停止的方式 '主題' 如果我再次解析它?如果我在正則表達式之前或之後做'email_payload ['subject']',它會再次過濾掉這些字母。 – dannymcc

+1

@dannymcc如果你不想覆蓋它,使用'.gsub()',而不是'.gsub!()' –

+0

@dannymcc既然你有未接受這一點,請澄清你的需要.. –

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

這假設你想要的數字進屋[]支架選擇和]是在字符串的結尾。

+0

不知何故,你的例子似乎只能顯示一位數字。 – dannymcc