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

substring函数提取数字异常:第三行数字无法解析的问题排查

问题分析与解决

你的问题出在substring的行为和正则模式的设计上:

  1. PostgreSQL的substring(string from pattern)仅返回第一个匹配的子串,不会遍历整个字符串找所有匹配项。
  2. 你使用的[\d\s]+模式会匹配连续的数字或空格,第三行数据Bar blah blah 444444中,第一个符合该模式的子串是Bar后的单个空格(而非末尾的数字),因此返回的内容是空格(视觉上近似空),自然提取不到目标数字。

解决方案

根据你的需求(提取字符串中的数字),推荐以下几种方法:

方法1:保留数字间空格,清除其他字符

如果需要保留原数字的空格分隔格式(比如第一行的222 222),用全局替换清除所有非数字、非空格的字符:

select regexp_replace(USER_INPUT, '[^\d\s]', '', 'g') from test;

'g'参数表示全局替换所有匹配项,而非仅替换第一个。

方法2:合并所有数字为连续字符串

如果想把所有数字合并成一个连续字符串(比如第一行变成222222),清除所有非数字字符即可:

select regexp_replace(USER_INPUT, '[^\d]', '', 'g') from test;

方法3:提取独立的数字组

如果需要单独提取每个数字组(比如第三行的444444),用regexp_matches获取所有匹配的数字片段:

select regexp_matches(USER_INPUT, '\d+', 'g') from test;

如果要将每行的数字组用空格拼接,可搭配array_to_string:

select array_to_string(regexp_matches(USER_INPUT, '\d+', 'g'), ' ') from test;

测试输出示例

  • 方法1输出:
    222 222
     333333
          444444
    
  • 方法2输出:
    222222
    333333
    444444
    
  • 方法3拼接后输出:
    222 222
    333333
    444444
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:40:22