【问题标题】:MYSQL Regex Negative Lookahead alternativeMYSQL 正则表达式负前瞻替代
【发布时间】:2017-11-21 13:29:32
【问题描述】:

我正在对邮政编码/邮政编码字段进行查询。
我一直在进行一些研究,但不支持负前瞻:

"MySQL 支持 POSIX 正则表达式,不支持 PCRE"

是否有替代解决方案,使用 MYSQL 支持的正则表达式?

(?i)^W(?!C) -- 这是 PHP 中的解决方案

以及对数据库的示例查询

select postcode from `postcodes` WHERE LOWER(postcode) REGEXP '^W(?!C)'

【问题讨论】:

  • 您想要获取以“W”开头、后跟“C”以外的其他内容的邮政编码?
  • MariaDB 10.0 确实可以处理 PCRE。

标签: php mysql regex


【解决方案1】:

在 MySQL 中,你可以使用

WHERE postcode REGEXP '^W([^C]|$)'

([^C]|$) 匹配除C 或字符串结尾之外的任何字符。此外,无需使用TOLOWER,因为正则表达式搜索默认不区分大小写。

online tests

SELECT 'wc' REGEXP '^W([^C]|$)'; // => 0
SELECT 'wR' REGEXP '^W([^C]|$)'; // => 1
SELECT 'w' REGEXP '^W([^C]|$)';  // => 1

【讨论】:

    【解决方案2】:

    您可以反转您想要实现的正则表达式并使用NOT REGEXP

    SELECT postcode from `postcodes`
    WHERE postcode NOT REGEXP '^w(c|$)'
    

    上面的代码是关于问题中提出的单个字符。 对于在此线程中结束并使用 full word 寻找否定前瞻的人来说,与@Wiktor Stribiżew 的其他答案相比,这也是可能的

    -- So not the word 'not_this_word' or end of the string '$'
    SELECT postcode from `postcodes`
    WHERE postcode NOT REGEXP '^w(not_this_word|$)'
    

    或者您可以使用 NOT IN 进行子查询

    SELECT postcode from `postcodes`
    WHERE postcode NOT IN (
        SELECT postcode from `postcodes` WHERE postcode REGEXP '^w(not_this_word|$)'
    )
    

    【讨论】:

    • 我认为您的表达不尊重问题中的全部要求。 OP 需要找到所有邮政编码以W 开头且第二个字符不是C(或可能不存在)的邮政编码。对吗?
    • 好的,我可以写 '^wc' 而不是 '^ wnot_this_word'。但我只是想表明我的答案并不局限于 1 个单个字符 'c',但您甚至可以添加一个可能不在字母 'w' 之后的整个单词。但我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多