【问题标题】:Using SIMILAR TO for a regex?使用 SIMILAR TO 进行正则表达式?
【发布时间】:2014-08-30 15:25:13
【问题描述】:

为什么下面的指令返回FALSE

SELECT '[1-3]{5}' SIMILAR TO '22222' ;

根据 Postgres 文档,我找不到这有什么问题...

【问题讨论】:

  • @Erwin :感谢您用正确的术语纠正我的帖子......我不是以英语为母语的人,所以有些词可能不合适。而且我还不太习惯stackoverflow。

标签: regex postgresql pattern-matching


【解决方案1】:

运营商is defined as

string SIMILAR TO pattern 

所以第一个参数是你要比较的字符串。第二个参数是要比较的正则表达式。

你需要:

SELECT '22222' SIMILAR TO '[1-3]{5}';

【讨论】:

    【解决方案2】:

    试试

    SELECT '22222' ~ '[1-3]{5}'
    

    SIMILAR 不是 POSIX 标准

    SIMILAR TO 运算符根据其模式是否与给定字符串匹配返回真或假。它类似于 LIKE,除了它使用 SQL 标准的正则表达式定义来解释模式。 SQL 正则表达式是 LIKE 表示法和普通正则表达式表示法之间的奇妙交叉。

    ...

    POSIX 正则表达式提供了比 LIKE 和 SIMILAR TO 运算符更强大的模式匹配方法。许多 Unix 工具(例如 egrep、sed 或 awk)使用的模式匹配语言与此处描述的语言类似。

    http://www.postgresql.org/docs/9.2/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP

    【讨论】:

      【解决方案3】:

      您的基本错误已得到解答。
      更重要的是,根本不要使用SIMILAR TO。完全没有意义:

      使用LIKE或正则表达式匹配~或其他模式匹配运算符:

      对于 1 到 3 之间的 5 位数字,请使用 the expression @Thomas provided

      如果您真的想要 1 和 3 之间的 5 个 相同 位,就像您的示例建议的那样,我建议您使用 后向参考

      SELECT '22222' ~ '([1-9])\1{4}'
      

      更多解释的相关答案:
      Deleting records with number repeating more than 5

      SQL Fiddle demonstrating both.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2020-02-18
        • 1970-01-01
        • 2013-02-01
        • 2013-05-29
        • 1970-01-01
        相关资源
        最近更新 更多