为什么PostgreSQL会为simular regexp返回不同的结果?

时间:2016-04-26 13:45:03

标签: regex postgresql

我是postgreSQL的新手,面临一个奇怪的问题:

查询为同一正则表达式返回不同的结果。这怎么可能?

为什么前3个查询在最后一个返回正确的'true'时返回null。

我读了postgreSQL documentation,但仍然无法弄清楚这些功能之间的区别。

请帮忙。

select '12340599' like '^[0-9]*$'
select '12340599' similar to '^[0-9]*$'
select substring('12340599' from '^[0-9]*$' for '#')
select '12340599' ~ '^[0-9]*$'

2 个答案:

答案 0 :(得分:0)

你让运营商感到困惑;深入了解文档: http://www.postgresql.org/docs/current/static/functions-matching.html

  

选择'12340599',如'^ [0-9] * $':

LIKE不是正则表达式运算符,它使用%来匹配任何零个或多个字符的字符串,并使用_来匹配单个字符:

'abc' LIKE 'abc'    true
'abc' LIKE 'a%'     true
'abc' LIKE '_b_'    true
'abc' LIKE 'c'      false
  

选择'12340599'类似于'^ [0-9] * $':

SIMILAR TO的行为与LIKE运算符类似,但也不区分大小写。

  

选择子字符串('^ [0-9] *''代表'#'的'12340599'):

您正在使用substring(string from pattern for escape)提取与SQL正则表达式匹配的子字符串。

substring('Thomas' from '%#"o_a#"_' for '#') -> oma

正则表达式运算符是:

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive
!~  Does not match regular expression, case sensitive
!~* Does not match regular expression, case insensitive

答案 1 :(得分:0)

嗯,文档中写得很好。每个运算符都支持特定的模式系统:

<强> LIKE

  

如果pattern不包含百分号或下划线,则该模式仅表示字符串本身;在这种情况下,LIKE的行为类似于equals运算符。模式中的下划线(_)代表(匹配)任何单个字符;百分号(%)匹配零个或多个字符的任何序列。

类似于

  

它类似于LIKE,除了它使用SQL标准的正则表达式定义来解释模式。 SQL正则表达式是LIKE表示法和常用正则表达式表示法之间的奇怪交叉。

在您已经看到的the same docs中可以找到SQL正则表达式的确切内容。这些比POSIX正则表达式小一点。例如,他们不支持^$个特殊字符。

〜操作员

这些是POSIX regular expressions

<强>子

请参阅此http://www.postgresql.org/docs/current/static/functions-string.html

如果将它与FOR一起使用,它将对SQL正则表达式起作用。如果没有FOR,它就会对POSIX正则表达式起作用。