一尘不染

MySQL REGEXP单词边界[[:<:]] [[:>:]]和双引号

mysql

我正在尝试将某些全字词表达式与MySQL REGEXP函数进行匹配。当涉及到双引号时,就会出现问题。

MySQL文档说:“要在正则表达式中使用特殊字符的文字实例,请在其前面加上两个反斜杠()字符。”

但是这些查询都返回0:

SELECT '"word"' REGEXP '[[:<:]]"word"[[:>:]]';             -> 0
SELECT '"word"' REGEXP '[[:<:]]\"word\"[[:>:]]';           -> 0
SELECT '"word"' REGEXP '[[:<:]]\\"word\\"[[:>:]]';         -> 0
SELECT '"word"' REGEXP '[[:<:]] word [[:>:]]';             -> 0
SELECT '"word"' REGEXP '[[:<:]][[.".]]word[[.".]][[:>:]]'; -> 0

我还能尝试得到1?还是这不可能?


阅读 574

收藏
2020-05-17

共1个答案

一尘不染

首先让我引用文档

[[:<:]],[[:>:]]

这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是单词字符的序列,不能在单词字符之前或之后。单词字符是alnum类中的字母数字字符或下划线(_)。

从文档中,我们可以看到问题背后的原因,而原因并非由逃逸引起。问题是您试图[[:<:]]在字符串的开头匹配单词边界,这是行不通的,因为从文档中可以看到单词边界将单词字符与非单词字符分开,但是在您的情况下第一个字符是a
",不是单词字符,因此没有单词边界,最后一个"和也是如此[[:>:]]

为了使它起作用,您需要对此表达式进行一些更改:

"[[:<:]]word[[:>:]]"
 ^^^^^^^    ^^^^^^^

注意,此时的字边界分隔非单词字符"从字字符w在开始和"d字符串的结尾。

编辑: 如果您始终想在字符串的开头和结尾使用单词边界而不知道是否会有实际边界,则可以使用以下表达式:

([[:<:]]|^)"word"([[:>:]]|$)

这将匹配单词边界的开头或字符串的开头,并且匹配单词边界或字符串^结尾的结尾。我真的建议您研究要尝试匹配的数据,寻找常见的模式,如果它们不是适合工作的正确工具,请不要使用正则表达式。

SQL小提琴演示

2020-05-17