我的任务是为不同字符串中的条目创建一个黑名单。我正在使用MySQL
检查数据库中的条目。
你可能知道MySQL
中的单词边界标记:[[:<:]]
和[[:>:]]
对应默认regexp中的'b
。
当字符串中有regexp special characters
和word 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:]])