【问题标题】:Regular expressions in Postgres [duplicate]Postgres中的正则表达式[重复]
【发布时间】:2019-11-01 18:51:02
【问题描述】:

全部。

我正在查询 Postgres 9.3 数据库以查找字段中的特定模式:

SELECT
 P.id, P.processo_id, PR.num_formated
FROM
 publications P
INNER JOIN processos PR ON PR.id=P.processo_id
WHERE
 --The first numeric sequence must be exact 4 digits length, so the initial \d{4}
 PR.num_formated ~ '\d{4}[\.\-\\]\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4}'
AND
 P.id=781291700 --Just to force a specific record

其中PR.num_formated 定义为"character varying(255)"。执行后,查询返回:

  P.id      P.processo_id        PR.num_formated
781291700     502707245    20190001418-14.1998.8.05.0103

我的问题是:为什么 Postgres “忽略”第一个 \d?它解释与“传统/常规/正统/任何”方式不同的正则表达式的形式是否有任何特殊性,因为相同的正则表达式在我系统的另一部分完美地工作,但使用 ruby​​ 代码?

提前致谢

沃利德

【问题讨论】:

  • 预期输出是多少?结果似乎与您给出的正则表达式匹配。
  • 您应该以不需要我们访问您的计算机来测试它的方式编写您的示例。 select '20190001418-14.1998.8.05.0103' ~ '\d{4}[\.\-\\]\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4}' ;
  • 这个正则表达式在 ruby​​ 中的行为方式与在 postgresql 中的行为方式相同。我得到了ruby -le 'print "20190001418-14.1998.8.05.0103" =~ /\d{4}[\.\-\\]\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4}/'的匹配项

标签: regex postgresql sequence numeric


【解决方案1】:

前 7 个字符被忽略,因为查询将模式作为字符串的一部分。如果要匹配整个字符串,请使用 ^$ constraints.

'^\d{4}[\.\-\\]\d{2}\.\d{4}\.\d{1}\.\d{2}\.\d{4}$'

【讨论】:

  • 你是对的,伙计。我不相信我会错过这样基本的东西。多么菜鸟的错误啊!感谢您的耐心等待。
  • 这个错误很常见并且可以解释,因为人们更经常使用LIKE 运算符,它以不同的方式处理问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多