Mysql匹配带括号边界的单词

时间:2016-06-28 07:28:34

标签: 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 | bbb(ccc)ddd   |
|  8 | (ccc)dddeee   |
|  9 | aaabbb(ccc)   |
+----+---------------+
9 rows in set (0.00 sec)

我想将“(ccc)”字符串仅作为单词匹配,所以我希望在结果中看到行#2,#4和#6。我试过了这个:

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)

有没有解决方案?

5 个答案:

答案 0 :(得分:2)

对于这种单词搜索,您可以使用

 SELECT * FROM test WHERE duma like '%(ccc)%';

答案 1 :(得分:1)

您在这里不需要{{coeff(NS)...}}; ,您只需使用LIKE进行此比较:

REGEXP

答案 2 :(得分:1)

除了疯狂之外,括号不是单词字符,因此单词边界标记将不匹配。来自the manual

[[:<:]], [[:>:]]
     

这些标记代表字边界。他们匹配开头和   词尾,分别。一个单词是一系列单词字符   不在单词字符之前或之后的单词字符。 一个字   character是alnum类中的字母数字字符或   下划线(_)

答案 3 :(得分:1)

您可以like使用or来覆盖您想要的空间......

 SELECT * FROM test 
 WHERE duma LIKE '(ccc) %' 
 OR duma LIKE '% (ccc)' 
 OR duma LIKE '% (ccc) %'

答案 4 :(得分:0)

REGEXP '(^| )[(].*[)]( |$)'

这可能比3 OR的{​​{1}}快。

你对“单词”的定义是在两边都有一个空格或字符串的开头/结尾。这不是传统的定义,因此到目前为止给出的所有答案(包括我的)都不符合传统的定义。