【问题标题】: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

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

【问题讨论】:

    标签: php mysql sql regex database


    【解决方案1】:

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

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

    【讨论】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2016-08-09
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多