使用单词边界[[:&lt ;:]]和[[:>]]时的奇怪行为

时间:2013-04-07 21:29:59

标签: php mysql sql regex database

我的任务是为不同字符串中的条目创建黑名单。我正在使用MySQL检查数据库中的条目。

你可能知道MySQL中的单词边界标记: [[:<:]][[:>:]]对应默认regexp中的\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

有人可以解释一下如何解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

第一个失败是因为最后一个单词边界与单词边界不匹配:右括号和字符串的结尾不是单词边界位置。引用mysql reference给出的定义:
一个单词是一系列单词字符,前面或后面跟着单词字符。

作为旁注,它也不适用于另一种语言。

答案 1 :(得分:1)

不要以为你可以在MySQL中做得很好。由于没有外观(并且无法否定[[:<:]][[:>:]]?)。

根据您定义单词边界的方式(特别是涉及非单词字符时,例如[^A-Za-z0-9_]),在某些情况下您可以使用如下表达式:

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