首页 > 解决方案 > 如何捕获正则表达式首次出现并使用 postgreSQL 插入字符串

问题描述

我正在尝试将以 'CityName' 开头的字符串中的数字连接成一个单独的字符串。我有连接部分。我的问题是能够从正则表达式访问匹配项 我在 rails 中有一个看起来像/CityName\s*(\d+)/i. 我对正则表达式非常陌生,我很难将我的头绕在文档上。但我假设这个正则表达式会在CityName案例之后密集地找到任何数字。如果它与我的模型上的属性匹配,则会对其进行插值。

regex = /CityName\s*(\d+)/i
if line_1 =~ regex
  "C#{$1}"
  ...
end

但在执行过程中,它的速度变慢了,因为我必须遍历很多记录。我在 psql 中有一个查询可以进行我需要的计算,但是我很难实现这个正则表达式替换。到目前为止,我的尝试看起来像:

CASE
    when addr.line_1 ~* 'CityName\s*(\d+)' then 'C' || regex_matches('CityName\s*(\d+)')[0]
...

我很难找到一个解决方案来抓住第一次出现的正则表达式匹配。感谢您的任何提示:D

编辑:如果该字符串包含“CityName”,我正在尝试从字符串中获取“CityName”之后的数字最终我需要正则表达式的帮助以及如何使用“C”联系数字

标签: ruby-on-railspostgresql

解决方案


你的问题有点不清楚。您是否尝试将数字添加到您的选择中或根据它们过滤记录?

如果您只想选择它们:

Address.select(%q{(regexp_matches(addr.line_1, 'CityName\s*(\d+)'))[1] as digits})
  .map(&:digits)

如果你想基于那么过滤:

Address.where(%q{addr.line_1 ~ 'CityName\s*(\d+)'}).map &:email
  .map(&:line_1)

还有一些注意事项:

  • 集中选择数字大小写并没有真正的意义。数字没有大小写。
  • PostgreSQL 数组从 1 而不是 0 开始。

推荐阅读