MySQL 8.0.30具有特殊字符的正则表达式单词匹配



当有一个被告知"旧的";在互联网上使用现在不受支持的"[[:<:]]word[[:>:]]"技术的例子中,我试图了解如何在MySQL 8.0.30中,从我们的表中用包含特殊字符的单词进行精确的单词匹配。

例如,我们有一段文字,如:

"Senior software engineer and C++ developer with Unit Test and JavaScript experience. I also have .NET experience!"

我们有一个关键字表来匹配这一点,并且一直在使用的基本系统

SELECT
sk.ID
FROM
sit_keyword sk
WHERE
var_text REGEXP CONCAT('\b',sk.keyword,'\b')

它90%的时间都很好,但在上完全失败

C#、C++、.NET、A+或";A+";等等。所以它无法将关键字与其中的特殊字符进行匹配。

我似乎找不到任何关于如何解决这一问题的最新文档,因为如前所述,我能找到的几乎所有示例都使用了不支持的旧技术。注意,我需要在源文本的任何地方匹配这些单词(使用特殊字符(,这样它可以是第一个或最后一个单词,也可以是在中间的某个地方。

如有任何关于使用REGEXP进行此操作的最佳方法的建议,我们将不胜感激。

您需要转义搜索短语中的特殊字符,并使用我调用的构造"自适应动态单词边界";代替单词边界:

var_text REGEXP CONCAT('(?!\B\w)',REGEXP_REPLACE(sk.keyword, '([-.^$*+?()\[\]{}\\|])', '\$1'),'(?<!\w\B)')

REGEXP_REPLACE(sk.keyword, '([-.^$*+?()\[\]{}\\|])', '\$1')匹配. ^ $ * + - ? ( ) [ ] { } |字符(在它们之前添加(,并且(?!\B\w)/(?<!\w\B)仅当搜索短语以单词字符开始/结束时才需要单词边界。

更多关于自适应动态单词边界的细节和演示在我的YT视频中。

正则表达式将几个字符视为元字符。有关正则表达式语法的手册中介绍了这些内容:https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-语法

如果需要将元字符视为文字字符,则需要使用反斜杠对其进行转义。

这变得非常复杂。如果你只想搜索子字符串,也许你应该使用LOCATE():

WHERE LOCATE(sk.keyword, var_text) > 0

这避免了元字符的所有欺骗。它将sk.keyword的字符串视为仅包含文字字符。

最新更新