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


Odd behaviour when using word boundaries [[:<:]] and [[:>]]

我的任务是为不同字符串中的条目创建一个黑名单。我正在使用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
谁能解释一下如何解决这个问题?

第一个失败,因为最后一个单词边界不能匹配单词边界:一个右括号和字符串的末尾不是单词边界位置。引用mysql的定义:
"一个单词是一个单词字符序列,它的前面或后面没有单词字符。 "

作为旁注,它也不能用于其他语言

不要认为你可以很好地在MySQL中做到这一点。因为没有查找(也没有办法否定[[:<:]][[:>:]] ?)。

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

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