Postgres正则表达式逃脱美元符号

时间:2016-02-10 19:47:27

标签: ruby-on-rails regex postgresql

我使用的是Rails / ActiveRecord / 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,.*')"

1 个答案:

答案 0 :(得分:2)

你的问题的答案是,你需要逃避反斜杠。你想把它们传递给Postgres,但Ruby正在逃避美元。 (它不需要,因为'$'不是Ruby字符串中的特殊字符,但无论如何它都会让你这样做。)

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

您的问题的答案是,您可能根本不需要指定美元。试试这个:

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

帮助您解释此正则表达式:

  • ^ =行首
  • [^,] =逗号以外的任何字符
  • * = 0到很多次

这也可以确保您在不是之后的逗号后找不到您的号码。