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

Hei*_*koS 9 regex mysql word-boundary

我试图将一些全字表达式与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
Run Code Online (Sandbox Code Playgroud)

还有什么可以尝试获得1?或者这不可能吗?

Ibr*_*jar 25

让我先引用文档:

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

这些标记代表字边界.它们分别匹配单词的开头和结尾.单词是一系列单词字符,其前面或后面没有单词字符.单词字符是alnum类中的字母数字字符或下划线(_).

从文档中我们可以看到问题背后的原因,并不是由于逃避而造成的.问题是你试图匹配[[:<:]]字符串开头的单词边界,这不起作用,因为你可以从文档中看到的单词边界将单词字符与非单词字符分开,但在你的情况下第一个字符是一个",所以没有单词边界是不发一言的性格,也是如此,最后"和[[:>:]].

为了使其工作,您需要将表达式稍微更改为此表达式:

"[[:<:]]word[[:>:]]"
 ^^^^^^^    ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

请注意如何字边界分隔非单词字符"从字字符w在开始和"从d字符串的结尾.

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

([[:<:]]|^)"word"([[:>:]]|$)
Run Code Online (Sandbox Code Playgroud)

这将匹配开头的字边界或字符串的开头,^并且对于字边界或字符串结尾的结尾相同.我真的建议你研究你想要匹配的数据并寻找常见的模式,如果它们不适合这项工作,就不要使用正则表达式.

SQL小提琴演示

  • 我不认为我是第一个想知道为什么输入 mysql 的正则表达式边界如此痛苦的人……认真的吗?7 个字符作为一个简单的边界? (2认同)

Luk*_*nga 5

在 MySQL 8 及以上版本中

添加到 Oleksiy Muzalyev 的答案

https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-compatibility

在 MySQL 8.04 及更高版本中,您必须使用:

\bword\b
Run Code Online (Sandbox Code Playgroud)

其中\b表示字边界的 ICU 变体。以前的 Spencer 库用来[[:<:]]表示单词边界。

当实际使用它作为查询的一部分时,我必须转义转义字符,\所以我的查询实际上看起来像

SELECT * FROM table WHERE field RLIKE '\\bterm\\b'
Run Code Online (Sandbox Code Playgroud)

从 PHP 查询时,使用单引号来做同样的事情

$sql = 'SELECT * FROM table WHERE field RLIKE ?';
$args = ['\\bterm\\b'];
...
Run Code Online (Sandbox Code Playgroud)