如何在REGEXP中转义MySQL中的星号(*)

如何在REGEXP中转义MySQL中的星号(*),mysql,regex,Mysql,Regex,我尝试在MySQL中将关键字与REGEXP匹配,如下所示: -- Match "fitt*", the asterisk "*" is expected to be matched as-is > select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\*[[:>:]]'; -- return 1, ok > select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt\*[[:>:]]';

我尝试在MySQL中将关键字与REGEXP匹配,如下所示:

-- Match "fitt*", the asterisk "*" is expected to be matched as-is

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\*[[:>:]]'; -- return 1, ok
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt\*[[:>:]]'; -- return 1 as well, but should return 0

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\\*[[:>:]]'; -- return 0, failed
如何转义星号*以精确匹配字符*?

\\\*是匹配星号的正确方法。但是[[:>:]]之后不会匹配,因为它只匹配单词字符和非单词字符,并且*不是单词字符。相反,您需要显式地匹配非单词字符。您还需要为行尾添加一个替代项,因为这是另一种类型的单词边界

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\\*([^[:alnum:]]|$)'; -- returns 1
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt\\*([^[:alnum:]]|$)'; -- returns 0
另一种显式匹配星号的方法是将其放入字符类中

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt[*]([^[:alnum:]]|$)'; -- returns 1
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt[*]([^[:alnum:]]|$)'; -- returns 0

可能有3个问题:

第1项:标题问题的答案如下:

\\*  (in the regexp)
[*]
第2项:\\\*如果您来自某个客户端,在将反斜杠馈送到MySQL之前首先取消反斜杠,则可能需要它,MySQL仍然需要反斜杠。但是,在编写时没有任何客户端代码,\\\*被视为零个或多个反斜杠


第3项:@Barmar的答案集中在为什么[[:>:]]不正确。

问题不在于星号,而在于[[:>:]]。只在单词边界处匹配,但*和空格之间没有单词边界,因为*不是单词字符。@Barmar谢谢。但是如何将fitt*这个词与REGEXP匹配呢?我根据@Barmar和我之间的争论更改了标题。否。\\*表示零个或多个反斜杠。您的测试之所以能够正常工作,是因为它发现了零个反斜杠,然后是一个*,它不是一个“alnum”。@RickJames第一个反斜杠转义了字符串中的第二个反斜杠。由此产生的反斜杠将转义regexp中的*。如果我将反斜杠放在正在测试的字符串中,它将不匹配。字符串中的反斜杠是否已转义?选择“a\b”REGEXP“a.b”,“a\\b”REGEXP“a.b”;->0,1。@RickJames select'aaaa fitt\\\\*bbb'regexp'[[:\\\*如果您在查询中按字面意思编写字符串,则需要使用它,因为MySQL本身首先会取消反斜杠。如果您使用的客户端编程语言也会取消斜杠,则需要再次将其加倍,例如$sql=选择'aaaa fitt*bbb'regexp'[[:@Barmar和Zelong-我正在mysql命令行工具中进行测试;您在测试什么?