2013-04-07 68 views
3

我的任务是为不同字符串中的条目创建黑名单。我正在使用MySQL检查数据库中的条目。使用字边界时的奇怪行为[[:<:]] and [[:>]]

你可能知道单词边界标志着MySQL[[:<:]][[:>:]]对应于\b在默认情况下正则表达式。

当一个字符串中有regexp special charactersword boundary marks时出错。

但是这些角色是通过双反斜杠逃脱的!

只要运行这个查询

SELECT 
"test()" REGEXP "[[:<:]]test\\(\\)[[:>:]]", 
"test()" REGEXP "test\\(\\)", 
"test" REGEXP "[[:<:]]test[[:>:]]", 
"test" REGEXP "test" ; 

,你会得到

0 | 1 | 1 | 1 

相反的预期

1 | 1 | 1 | 1 

可能有人,请解释一下如何解决这个问题?

回答

1

不要以为你可以在MySQL中做到这一点。由于没有lookarounds(并且没有办法否定[[:<:]][[:>:]]?)。

取决于你如何定义字边界(尤其是在非单词字符都参与其中,如[^A-Za-z0-9_]),你可以在某些情况下使用的表达,如:

(^|[[:space:]])test\(\)($|[[:space:]]) 
+0

感谢您指出解决方案,这工作! – vikingmaster 2013-04-07 22:32:02

3

第一次失败,因为最后一个单词边界不能匹配单词边界:右括号和字符串的结尾不是单词边界位置。引述mysql reference给出的定义:“一个字是不是由前面或后面的单词字符单词字符序列

作为一个侧面说明,它不会再工作语言。

+0

谢谢你的问题的描述,现在的我得到它。投票。 – vikingmaster 2013-04-07 22:31:27