如果我运行此查询:
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。
任何人都知道两个版本之间有什么区别?
答案 0 :(得分:3)
在正则表达式子字符串匹配中修复一个角点案例
(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.
SIMILAR TO
个表达式
答案 2 :(得分:0)
按照Craig Ringer的建议,改为:
SELECT 'Via Orologio 122 A' ~ '(Strada|Via) .+ [0-9]+( [A-Z])?';
解决了这个问题。 '〜'似乎是比'SIMILAR TO'
更好的解决方案