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

Posted

技术标签:

【中文标题】使用单词边界 [[:<:]] 和 [[:>]] 时的奇怪行为【英文标题】:Odd behaviour when using word boundaries [[:<:]] and [[:>]] 【发布时间】:2013-03-29 21:12:04 【问题描述】:

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

你可能知道MySQL中的单词边界标记: [[:&lt;:]][[:&gt;:]] 对应于默认正则表达式中的 \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

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

【问题讨论】:

【参考方案1】:

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

附带说明,它也不适用于其他语言。

【讨论】:

感谢您对问题的描述,现在我明白了。投票。【参考方案2】:

不要认为你可以在 MySQL 中很好地做到这一点。因为没有环视(也没有办法否定[[:&lt;:]][[:&gt;:]]?)。

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

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

【讨论】:

以上是关于使用单词边界 [[:<:]] 和 [[:>]] 时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

为啥超出单行 TextView 边界的单词不会被渲染和剪切?

正则表达式 -断言

为什么我不能在单词边界旁使用带重音符号?

特殊字符之前的单词边界匹配失败

如何在 pandas str.contains 中使用 \b 单词边界?

Javascript RegExp + 单词边界 + unicode 字符