3

我的任务是为不同字符串中的条目创建一个黑名单。我正在使用MySQL.

您可能知道 : 中的单词边界标记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

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

4

2 回答 2

3

第一个失败是因为最后一个单词边界不能匹配单词边界:右括号和字符串的结尾不是单词边界位置。引用mysql 参考给出的定义:
一个单词是一个单词字符的序列,其前后没有单词字符。

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

于 2013-04-07T21:48:34.503 回答
1

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

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

(^|[[:space:]])test\(\)($|[[:space:]])
于 2013-04-07T21:48:49.953 回答