MYSQL Regex Negative Lookahead替代方案

时间:2017-06-19 10:57:43

标签: php mysql regex

我正在对邮政编码/邮政编码字段进行查询。
我一直在进行一些研究,并且不支持负面的预测:

  

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

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

import java.util.ArrayList; import java.util.Collections; public class ComparatorExample { static class Person implements Comparable<Person> { private String initial; private String surName; public Person(final String initial, final String surName) { this.initial = initial; this.surName = surName; } public String getInitial() { return initial; } public void setInitial(final String initial) { this.initial = initial; } public String getSurName() { return surName; } public void setSurName(final String surName) { this.surName = surName; } @Override public int compareTo(final Person o) { return surName.compareTo(o.surName); } @Override public String toString() { return initial + ' ' + surName; } } public static void main(String[] args) { Person a = new Person("A", "John"); Person b = new Person("B", "Adam"); Person c = new Person("K", "Henry"); ArrayList<Person> list = new ArrayList<>(); list.add(a); list.add(b); list.add(c); System.out.println(list); Collections.sort(list); System.out.println(list); } } - 这是PHP中的解决方案

对数据库的示例查询

(?i)^W(?!C)

2 个答案:

答案 0 :(得分:3)

在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

答案 1 :(得分:0)

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

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

上面的代码是关于问题中询问的单个字符。 对于在此线程中结束并寻找带有完整单词的否定前瞻的人来说,与@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|$)'
)