4

如果我运行此查询:

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

我希望得到 TRUE。postgreSQL 9.1.8 版返回预期值,但在 8.3 版中它返回 FALSE。我认为问题是最后一个问号。事实上,查询:

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

在两个版本中都返回 TRUE。

谁知道这两个版本有什么区别?

4

3 回答 3

3

8.3.2 的更新日志

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

于 2013-03-24T22:24:07.617 回答
1

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

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

提示:
您可以让 Postgres使用 dba.SE 上相关答案中概述SIMILAR TO的技术为您翻译表达式。

于 2013-03-24T23:34:48.933 回答
0

按照克雷格·林格的建议,改为:

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

解决了这个问题。'~' 似乎是比 'SIMILAR TO' 更好的解决方案

于 2013-03-24T23:02:04.590 回答