如何改进正则或函数提取字符串中首次出现的含空格数字?
提取带空格的付款金额解决方案
你之前用regexp_replace把所有字母、冒号、空格都去掉,导致后面的ID也被保留了,问题出在没有限定提取的范围——我们只需要**"Payment amount: "之后、" from "之前的部分**,不管中间有没有空格。
下面给你几个实用的方案,适配不同数据库的函数支持:
方案1:用正则匹配捕获目标区间(推荐)
如果你的数据库支持正则捕获组(比如PostgreSQL、MySQL 8.0+),直接用regexp_match或者substring提取指定区间的内容:
PostgreSQL 示例
SELECT (regexp_match('Payment amount: 13 450,20 from 144232', 'Payment amount: (.*?) from '))[1]; -- 返回结果:13 450,20
或者更简洁的substring写法:
SELECT substring('Payment amount: 11000,50 from 144232' from 'Payment amount: (.*?) from '); -- 返回结果:11000,50
这里的(.*?)是非贪婪匹配,会精准停在第一个" from "出现的位置,完美避开后面的ID。
方案2:用regexp_replace精准替换无关内容
如果你更习惯用regexp_replace,可以针对性替换掉开头的固定前缀和结尾的多余内容:
SELECT regexp_replace('Payment amount: 13 450,20 from 144232', '^Payment amount: | from .*$', '', 'g');
解释一下正则规则:
^Payment amount::匹配字符串开头的固定前缀,替换为空from .*$:匹配" from "开头直到字符串结尾的所有内容,替换为空- 最终剩下的就是你要的金额数字(包含中间的空格)
可选:去掉金额中的空格
如果你需要把金额里的空格去掉(比如把13 450,20转成13450,20),可以在提取后再套一层替换:
SELECT regexp_replace( substring('Payment amount: 13 450,20 from 144232' from 'Payment amount: (.*?) from '), '\s', '', 'g' ); -- 返回结果:13450,20
内容的提问来源于stack exchange,提问作者FeoJun
相关产品推荐
相关产品推荐

