[英]How to escape special SQL characters in regular expression in Mysql
[英]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.