【问题标题】:Why PostgreSQL return different result for simular regexp?为什么 PostgreSQL 为模拟正则表达式返回不同的结果?
【发布时间】:2016-04-26 13:45:03
【问题描述】:

我是 postgreSQL 的新手,遇到一个奇怪的问题:

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

为什么前三个查询返回 null 而最后一个返回正确的 'true'。

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

请帮忙。

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

【问题讨论】:

  • LIKE 不支持正则表达式。第一个不包含任何 SQL 通配符,因此它与 select '12340599' = '^[0-9]*$' 相同。如果我没记错的话,SIMILAR TO 不支持完整的 RegEx 功能

标签: regex postgresql


【解决方案1】:

好吧,它在文档中写得很好。这些运算符中的每一个都支持特定的模式系统:

喜欢

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

类似于

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

究竟什么是 SQL 正则表达式可以在the same docs 中找到,您已经看过了。这些比 POSIX 正则表达式要小一些。例如,它们不支持 ^$ 特殊字符。

~运算符

这些是POSIX regular expressions

子字符串

看到这个http://www.postgresql.org/docs/current/static/functions-string.html

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

【讨论】:

    【解决方案2】:

    您混淆了运营商;更深入地查看文档: 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
    

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

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


    选择子字符串('12340599' from '^[0-9]*$' for '#'):

    您正在使用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
    

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2015-07-22
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多