我的任务是为不同字符串中的条目创建黑名单。我正在使用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
有人可以解释一下如何解决这个问题吗?
答案 0 :(得分:3)
第一个失败是因为最后一个单词边界与单词边界不匹配:右括号和字符串的结尾不是单词边界位置。引用mysql reference给出的定义:
“一个单词是一系列单词字符,前面或后面跟着单词字符。”
作为旁注,它也不适用于另一种语言。
答案 1 :(得分:1)
不要以为你可以在MySQL中做得很好。由于没有外观(并且无法否定[[:<:]]
和[[:>:]]
?)。
根据您定义单词边界的方式(特别是涉及非单词字符时,例如[^A-Za-z0-9_]
),在某些情况下您可以使用如下表达式:
(^|[[:space:]])test\(\)($|[[:space:]])