使用单词边界 [[:<:]] 和 [[:>]] 时的奇怪行为
Posted
技术标签:
【中文标题】使用单词边界 [[:<:]] 和 [[:>]] 时的奇怪行为【英文标题】:Odd behaviour when using word boundaries [[:<:]] and [[:>]] 【发布时间】:2013-03-29 21:12:04 【问题描述】:我的任务是为不同字符串中的条目创建一个黑名单。我正在使用mysql
检查数据库中的条目。
你可能知道MySQL
中的单词边界标记:
[[:<:]]
和 [[:>:]]
对应于默认正则表达式中的 \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
有人能解释一下如何解决这个问题吗?
【问题讨论】:
【参考方案1】:第一个失败,因为最后一个单词边界不能匹配单词边界:右括号和字符串的结尾不是单词边界位置。引用mysql reference的定义: "一个单词是一个单词字符的序列,前面或后面都没有单词字符。"
附带说明,它也不适用于其他语言。
【讨论】:
感谢您对问题的描述,现在我明白了。投票。【参考方案2】:不要认为你可以在 MySQL 中很好地做到这一点。因为没有环视(也没有办法否定[[:<:]]
和[[:>:]]
?)。
根据您定义单词边界的方式(尤其是涉及非单词字符时,例如[^A-Za-z0-9_]
),您可以在某些情况下使用如下表达式:
(^|[[:space:]])test\(\)($|[[:space:]])
【讨论】:
以上是关于使用单词边界 [[:<:]] 和 [[:>]] 时的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
为啥超出单行 TextView 边界的单词不会被渲染和剪切?