2016-02-10 108 views
0

我正在使用Rails/ActiveRecord/Postgres。下面是一個簡單的測試字符串我想匹配 -Postgres正則表達式逃脫美元符號

:sample_data => "$$352054054640611,1010,2015/02/24,05:20:30,40.28370,-111.65530,1437.1,0,0,0,0,0.0,7,0.9,1010,0.0,12.2,8,1,0,81.3##"

我只是想查詢第一個逗號(例如:1010)後的第一個數字。在Rails中,我期待着做這樣的事情。

number = "1010" 
Model.where("sample_data ~* ?", "\$\$.*," + number + ",.*") 

問題是它看起來像Postgres不允許我像我希望的那樣逃脫兩個美元符號。


編輯

當我運行Model.where("sample_data ~* ?", "\$\$.*," + number + ",.*").to_sql

我得到 -

"SELECT \"Model\".* FROM \"Model\" WHERE (sample_data ~* '$$.*,1010,.*')" 
+0

您可以添加'Model.where(「sample_data〜*?」,「\ $ \ $。*,」+ number +「,。*」)。to_sql'的結果 – max

+0

@max我更新了我的問題結果 –

+1

嗯,也許你需要雙重逃脫? 'Model.where(「sample_data〜*?」,「\\ $ \\ $。*,」+ number +「,。*」)' – max

回答

2

回答你的問題,你需要躲避反斜槓。你想將它們傳遞給Postgres,但是Ruby正在轉義美元。 (這並不需要,因爲「$」是不是在Ruby字符串特殊字符,但它會告訴你也無妨。)

Model.where("sample_data ~* ?", "\\$\\$.*," + number + ",.*").to_sql 

回答你的問題,你可能根本不需要指定美元。試試這個:

Model.where("sample_data ~* ?", "^[^,]*,#{number}").to_sql 

爲了幫助你理解這個表達式:

  • ^ =行
  • [^,] =逗號以外的任何字符開始
  • * =零到多次

這也將確保你沒有找到你的號碼後面的逗號是不是第一個。