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

如何使用Snowflake提取字符串中第一个~与最后一个~之间的内容?

Snowflake提取第一个之后、最后一个之前的内容

你的当前查询只截取到了第二个的位置,所以会丢失中间多个的内容,下面是两种更靠谱的实现方式:

方法一:使用REGEXP_REPLACE(简洁直观)

利用正则替换直接提取目标区间的内容,正则匹配整个字符串,只保留第一个~之后到最后一个~之前的部分:

WITH sample_data AS (
    SELECT 'jjjjj~hhhhh-iiiiii~jklmn~abc' AS str UNION ALL
    SELECT 'ftgftr~hhhhhiiiiii~jklmn~trf' UNION ALL
    SELECT 'fgfgf~hhhhhiiiiii~fgfgf~tddrf' UNION ALL
    SELECT 'jjjjj~hhhhh-iiiiii~jklmererereren~abc'
)
SELECT 
    str,
    REGEXP_REPLACE(str, '^[^~]+~(.*)~.*$', '\\1') AS extracted_content
FROM sample_data;

正则逻辑说明:

  • ^[^~]+~:匹配字符串开头到第一个~的部分(包括第一个~)
  • (.*):捕获第一个~之后到最后一个~之前的所有内容(这是我们要保留的)
  • ~.*$:匹配最后一个~到字符串结尾的部分
  • 替换时用\\1引用捕获到的内容,直接得到目标结果

方法二:结合SUBSTR和REGEXP_INSTR(精准控制位置)

通过定位第一个~和最后一个~的位置,用SUBSTR截取区间内容:

WITH sample_data AS (
    SELECT 'jjjjj~hhhhh-iiiiii~jklmn~abc' AS str UNION ALL
    SELECT 'ftgftr~hhhhhiiiiii~jklmn~trf' UNION ALL
    SELECT 'fgfgf~hhhhhiiiiii~fgfgf~tddrf' UNION ALL
    SELECT 'jjjjj~hhhhh-iiiiii~jklmererereren~abc'
)
SELECT 
    str,
    SUBSTR(
        str,
        REGEXP_INSTR(str, '~', 1, 1) + 1,
        REGEXP_INSTR(str, '~', -1, 1) - REGEXP_INSTR(str, '~', 1, 1) - 1
    ) AS extracted_content
FROM sample_data;

位置计算说明:

  • REGEXP_INSTR(str, '~', 1, 1):找到第一个~的位置,加1就是目标内容的起始位置
  • REGEXP_INSTR(str, '~', -1, 1):从字符串末尾反向查找第一个~(也就是原字符串的最后一个~)的位置
  • 截取长度 = 最后一个~的位置 - 第一个~的位置 - 1,这样就能精准截取两个分隔符之间的所有内容

这两种方法都能正确处理中间包含多个~的情况,输出符合你的期望结果。

内容的提问来源于stack exchange,提问作者slider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:01:18