从PostgreSQL 8.3到9.2,regex匹配有什么变化?

kuarbcqp  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(3)|浏览(127)

如果我运行这个查询:

SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+( [A-Z])?';

字符串
我希望得到真实。PostgreSQL 9.1.8版返回预期值,但在8.3版中返回FALSE。我认为问题是最后的问号。事实上,查询:

SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+( [A-Z])';


在两个版本中都返回TRUE。
有谁知道这两个版本的区别是什么?

pokxtpni

pokxtpni1#

changelog of 8.3.2
修复正则表达式子字符串匹配(substring(string from pattern))中的一个角落情况(Tom)
当模式总体上匹配,但用户指定了一个带括号的子表达式,而该子表达式没有匹配时,就会出现问题。一个例子是substring('foo' from 'foo(bar)?')。这应该返回NULL,因为(bar)不匹配,但它错误地返回了整个模式匹配(即foo

vsaztqbk

vsaztqbk2#

使用带有(~)的正则表达式的直接替换将是:

SELECT 'Via Orologio 122 A' ~ '^(?:(?:Strada|Via) .* [0-9]+(?: [A-Z])?)$'

字符串

  • 左锚定和右锚定
  • 使用*,而不是+
  • 非捕获括号

提示:
您可以让Postgres使用technique outlined in this related answer on dba.SE.为您翻译SIMILAR TO表达式

esyap4oy

esyap4oy3#

根据克雷格Ringer的建议,更改为:

SELECT 'Via Orologio 122 A' ~ '(Strada|Via) .+ [0-9]+( [A-Z])?';

字符串
解决了问题'~'似乎是比'SIMILAR TO'更好的解决方案

相关问题