Mysql匹配带括号边界的单词
我有这张桌子:Mysql匹配带括号边界的单词,mysql,regex,Mysql,Regex,我有这张桌子: mysql> SELECT * FROM test; +----+---------------+ | id | duma | +----+---------------+ | 1 | bbb ccc ddd | | 2 | bbb (ccc) ddd | | 3 | ccc ddd eee | | 4 | (ccc) ddd eee | | 5 | aaa bbb ccc | | 6 | aaa bbb (ccc) | | 7
mysql> SELECT * FROM test;
+----+---------------+
| id | duma |
+----+---------------+
| 1 | bbb ccc ddd |
| 2 | bbb (ccc) ddd |
| 3 | ccc ddd eee |
| 4 | (ccc) ddd eee |
| 5 | aaa bbb ccc |
| 6 | aaa bbb (ccc) |
| 7 | bbb(ccc)ddd |
| 8 | (ccc)dddeee |
| 9 | aaabbb(ccc) |
+----+---------------+
9 rows in set (0.00 sec)
我只想将ccc字符串作为单词进行匹配,所以我希望看到结果中的第2、4和6行。我试过theese:
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]](ccc)[[:>:]]';
+----+---------------+
| id | duma |
+----+---------------+
| 1 | bbb ccc ddd |
| 2 | bbb (ccc) ddd |
| 3 | ccc ddd eee |
| 4 | (ccc) ddd eee |
| 5 | aaa bbb ccc |
| 6 | aaa bbb (ccc) |
| 7 | bbb(ccc)ddd |
| 8 | (ccc)dddeee |
| 9 | aaabbb(ccc) |
+----+---------------+
9 rows in set (0.00 sec)
好的,括号是模式字符,我试图转义它:
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]]\\(ccc\\)[[:>:]]';
Empty set (0.00 sec)
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]][(]ccc[)][[:>:]]';
Empty set (0.00 sec)
有什么解决办法吗?对于这种单词搜索,您可以像这样使用
SELECT * FROM test WHERE duma like '%(ccc)%';
对于这种单词搜索,您可以使用
SELECT * FROM test WHERE duma like '%(ccc)%';
此处不需要REGEXP,您只需使用:
SELECT * FROM test
WHERE duma LIKE '%(ccc)%';
此处不需要REGEXP,您只需使用:
SELECT * FROM test
WHERE duma LIKE '%(ccc)%';
撇开Escape madness不谈,括号不是单词字符,因此单词边界标记将不匹配。发件人: 这些标记代表单词的边界。它们匹配开头和结尾 分别是单词的结尾。单词是一系列单词字符 前面或后面没有单词字符的。一句话 字符是alnum类中的字母数字字符或 下划线
撇开Escape madness不谈,括号不是单词字符,因此单词边界标记将不匹配。发件人: 这些标记代表单词的边界。它们匹配开头和结尾 分别是单词的结尾。单词是一系列单词字符 前面或后面没有单词字符的。一句话 字符是alnum类中的字母数字字符或 下划线 您可以使用like with或来覆盖所需的空间
SELECT * FROM test
WHERE duma LIKE '(ccc) %'
OR duma LIKE '% (ccc)'
OR duma LIKE '% (ccc) %'
您可以使用like with或来覆盖所需的空间
SELECT * FROM test
WHERE duma LIKE '(ccc) %'
OR duma LIKE '% (ccc)'
OR duma LIKE '% (ccc) %'
这可能比3个喜欢的OR更快
您对单词的定义是在每一侧都有空格或字符串的开头/结尾。这不是传统的定义,所以到目前为止给出的所有答案,包括我的答案,都不符合传统的定义
这可能比3个喜欢的OR更快
您对单词的定义是在每一侧都有空格或字符串的开头/结尾。这不是传统的定义,所以到目前为止给出的所有答案,包括我的答案,都不符合传统的定义。你必须使用正则表达式吗?为什么不从杜马喜欢的“%ccc%”的测试中选择*呢?对不起,我编写了错误的示例表数据。现在我更正了。你必须使用正则表达式吗?为什么不从杜马喜欢的“%ccc%”的测试中选择*呢?对不起,我编写了错误的示例表数据。现在我改正了。