2017-03-03 80 views
0

我试图用这个正则表达式的字符串来查询我的MySQL数据库,MySQL的正则表达式 - 如何寻找一个特定的顺序组词

^(?=.*?\\bAuto\\b)(?=.*?\\bAnd\\b)(?=.*?\\bFashion\\b)(?=.*?\\bFair\\b).*$ 
在我的本地

它完美,但在远程服务器我得到的误差如下:

[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 

FYI,生成的查询字符串如下:

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

分割成几个'WHERE名称REGEXP“[[::<:]]Auto[[:>:]]”AND WHERE name REGEXP“[[::<:]]And[[:>:]]”AND WHERE name REGEXP“[[:<:]] Fashion [[: ]]“以及名称REGEXP”[[:<:]]Fair[[:>:]]“'。 MySQL正则表达式不支持'\ b',并且也不支持周边查询。 –

+0

MySQL的'REGEXP'不处理'(?'; MariaDB的确如此。 –

回答

0

MySQL regex是基于POSIX,并且不支持在您的正则表达式如下:

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

由于^(?=.*?\\bAuto\\b)(?=.*?\\bAnd\\b)(?=.*?\\bFashion\\b)(?=.*?\\bFair\\b).*$正则表达式匹配具有所有积极向前看符号中列出的全字的任何字符串,你只能重新写你的当前正则表达式为一系列WHERE name REGEXP "<whole_word>"

WHERE name REGEXP "[[:<:]]Auto[[:>:]]" AND WHERE name REGEXP "[[:<:]]And[[:>:]]" AND WHERE name REGEXP "[[:<:]]Fashion[[:>:]]" AND WHERE name REGEXP "[[:<:]]Fair[[:>:]]" 

而且,如果您需要区分大小写的搜索,则需要在REGEXP之后使用BINARY