substring函数提取数字异常:第三行数字无法解析的问题排查
问题分析与解决
你的问题出在substring的行为和正则模式的设计上:
- PostgreSQL的
substring(string from pattern)仅返回第一个匹配的子串,不会遍历整个字符串找所有匹配项。 - 你使用的
[\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
相关产品推荐
相关产品推荐

