正则表达式匹配中从PostgreSQL 8.3到9.2的变化是什么?

时间:2013-03-24 21:45:02

标签: regex postgresql

如果我运行此查询:

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。

任何人都知道两个版本之间有什么区别?

3 个答案:

答案 0 :(得分:3)

来自changelog of 8.3.2

  

在正则表达式子字符串匹配中修复一个角点案例   (substring(string from pattern))(汤姆)
  那里出现问题   是整体模式的匹配,但用户指定了   带括号的子表达式和子表达式没有匹配。   一个例子是substring('foo' from 'foo(bar)?')。这应该回来了   NULL,因为(bar)不匹配,但它错误地返回了   相反,整个模式匹配(即foo

答案 1 :(得分:1)

切换到正则表达式(~)时,替换为:

SELECT 'Via Orologio 122 A' ~ '^(?:(?:Strada|Via) .* [0-9]+(?: [A-Z])?)$'
  • 左锚定和右锚定
  • *,而不是+
  • 非捕获括号

提示:
您可以使用technique outlined in tis related answer on dba.SE.

让Postgres为您翻译SIMILAR TO个表达式

答案 2 :(得分:0)

按照Craig Ringer的建议,改为:

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

解决了这个问题。 '〜'似乎是比'SIMILAR TO'

更好的解决方案