如何按特定匹配规则实现子字符串搜索?
按指定规则匹配子字符串的解决方案
需求说明
现有字符串与子串的匹配需求,原始数据如下:
| String | Substring |
|---|---|
| Tattinger | TT |
| TT's | TT |
| TT Tattinger | TT |
| Tattinger TTa | TT |
| TTinger tab | TT |
匹配规则
- 子串不能处于单词内部的中间位置
- 子串必须位于某个单词的起始处
- 子串后接非字符(如
'.,#等)时,仍判定为匹配 - 其余情况均不匹配
预期匹配结果
| String | Substring | Result |
|---|---|---|
| Tattinger | TT | No |
| TT's tattinger | TT | Yes |
| TT Tattinger | TT | Yes |
| Tattinger TTa | TT | Yes |
| TTinger tab | TT | Yes |
已尝试的方法及问题
STRING LIKE '%' || SUBSTRING || '%':会匹配任意位置的子串,无法满足规则REGEXP_SUBSTR(STRING, SUBSTRING || '\\W'):仅能匹配子串后接非字符的情况,像TTinger这类子串后接字符的场景无法覆盖
可行解决方案
使用正则表达式精准定位单词起始位置的子串,结合数据库的正则匹配函数实现需求。
正则核心逻辑
要满足规则,需确保子串出现在以下两种位置之一:
- 整个字符串的开头
- 非单词字符(如空格、标点)之后(即某个单词的起始处)
对应的正则表达式模板为:(^|\W)[子串],其中:
^匹配字符串开头\W匹配任意非单词字符(包括空格、标点等)[子串]替换为实际要匹配的子串(如示例中的TT)
数据库具体实现
根据不同数据库的语法差异,给出两种常见实现:
PostgreSQL
SELECT "String", "Substring", CASE WHEN "String" ~ ('(^|\W)' || "Substring") THEN 'Yes' ELSE 'No' END AS "Result" FROM your_table_name;
MySQL
SELECT `String`, `Substring`, IF( `String` REGEXP CONCAT('(^|[^a-zA-Z0-9_])', `Substring`), 'Yes', 'No' ) AS `Result` FROM your_table_name;
方案说明
- 对于
TT's tattinger:字符串开头的TT被^匹配,判定为Yes - 对于
TT Tattinger:TT前是字符串开头,匹配成功 - 对于
Tattinger TTa:TT前是空格(非单词字符),被\W匹配,判定为Yes - 对于
TTinger tab:TT前是字符串开头,匹配成功 - 对于
Tattinger:TT处于单词内部,前面是字母a(单词字符),无法被(^|\W)匹配,判定为No
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

