簡體   English   中英

MySQL 8.0.30 正則表達式詞匹配特殊字符

[英]MySQL 8.0.30 Regular Expression Word Matching with Special Characters

雖然互聯網上有一個使用現在不受支持的 '[[:<:]]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 的最佳方法的建議將不勝感激。

正則表達式將多個字符視為元字符。 這些記錄在正則表達式語法手冊中: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-syntax

如果您需要將元字符視為文字字符,則需要使用反斜杠對其進行轉義。

這變得非常復雜。 如果您只想搜索子字符串,也許您應該使用LOCATE()

WHERE LOCATE(sk.keyword, var_text) > 0

這避免了元字符的所有詭計。 它將sk.keyword的字符串視為僅包含文字字符。

您需要轉義搜索短語中的特殊字符,並使用我稱之為“自適應動態詞邊界”的結構而不是詞邊界:

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

REGEXP_REPLACE(sk.keyword, '([-.^$*+?()\\[\\]{}\\\\|])', '\\$1')匹配. ^ $ * + -? ( ) [ ] { } \ | . ^ $ * + -? ( ) [ ] { } \ | chars(在它們之前添加\ )和(?!\\B\\w) / (?<!\\w\\B)僅當搜索短語以單詞 char 開頭/結尾時才需要單詞邊界。

我的 YT 視頻中有關自適應動態詞邊界和演示的更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM