MySQL Regex - 如何查找特定的连续单词集

时间:2017-03-03 10:14:57

标签: mysql regex

我试图使用此正则表达式字符串查询我的MySQL数据库

^(?=.*?\\bAuto\\b)(?=.*?\\bAnd\\b)(?=.*?\\bFashion\\b)(?=.*?\\bFair\\b).*$

在我的localhost上它运行正常,但在远程服务器上我收到如下错误:

[03-Mar-2017 09:49:47 UTC] PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1139 Got error 'repetition-operator operand invalid' from regexp' in /home/public_html/assets/sys/pdo.php:491

仅供参考,生成的查询字符串如下:

$SELECT * FROM table WHERE name REGEXP "^(?=.*?\\bAuto\\b)(?=.*?\\bAnd\\b)(?=.*?\\bFashion\\b)(?=.*?\\bFair\\b).*$" AND status = 1

1 个答案:

答案 0 :(得分:0)

MySQL regex基于POSIX,并且在正则表达式模式中不支持以下内容:

  • (?=...) - lookarounds(既不是向前看,也不是向后看)
  • *? - 懒惰量词
  • \\b - 字边界写为[[:<:]](单词位置的开头)和[[:>:]](单词位置的结尾)。

由于^(?=.*?\\bAuto\\b)(?=.*?\\bAnd\\b)(?=.*?\\bFashion\\b)(?=.*?\\bFair\\b).*$正则表达式匹配任何字符串,其中所有单词都列在正向前导中,因此您只能将当前正则表达式重写为一系列{{1} }:

WHERE name REGEXP "<whole_word>"

此外,如果您需要区分大小写的搜索,则需要在WHERE name REGEXP "[[:<:]]Auto[[:>:]]" AND WHERE name REGEXP "[[:<:]]And[[:>:]]" AND WHERE name REGEXP "[[:<:]]Fashion[[:>:]]" AND WHERE name REGEXP "[[:<:]]Fair[[:>:]]" 之后使用BINARY