You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按特定匹配规则实现子字符串搜索?

按指定规则匹配子字符串的解决方案

需求说明

现有字符串与子串的匹配需求,原始数据如下:

StringSubstring
TattingerTT
TT'sTT
TT TattingerTT
Tattinger TTaTT
TTinger tabTT

匹配规则

  • 子串不能处于单词内部的中间位置
  • 子串必须位于某个单词的起始处
  • 子串后接非字符(如'.,#等)时,仍判定为匹配
  • 其余情况均不匹配

预期匹配结果

StringSubstringResult
TattingerTTNo
TT's tattingerTTYes
TT TattingerTTYes
Tattinger TTaTTYes
TTinger tabTTYes

已尝试的方法及问题

  • STRING LIKE '%' || SUBSTRING || '%':会匹配任意位置的子串,无法满足规则
  • REGEXP_SUBSTR(STRING, SUBSTRING || '\\W'):仅能匹配子串后接非字符的情况,像TTinger这类子串后接字符的场景无法覆盖

可行解决方案

使用正则表达式精准定位单词起始位置的子串,结合数据库的正则匹配函数实现需求。

正则核心逻辑

要满足规则,需确保子串出现在以下两种位置之一:

  1. 整个字符串的开头
  2. 非单词字符(如空格、标点)之后(即某个单词的起始处)

对应的正则表达式模板为:(^|\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:30:52