PostgreSQL 12中如何使用正则表达式拆分含字母与浮点数的列内容?求最优解决方案
嘿,我来帮你搞定PostgreSQL 12里的这个正则拆分问题!你的需求是把name列按字母块和浮点数/整数块拆分,还要支持两种输出格式,之前用的REGEXP_MATCH只能处理单一数字块的场景,确实不够用,下面给你两种对应的最优实现方案:
第一种输出:严格按字母块和数字/浮点数块交替拆分
这个方案会把连续的字母、连续的数字(包括带小数点的浮点数)分别拆成独立的元素,完全匹配你给出的第一列Output结果。
用REGEXP_MATCHES配合全局匹配修饰符g,就能提取所有符合规则的片段,再聚合为数组:
SELECT name, ARRAY( SELECT unnest(REGEXP_MATCHES(name, '[A-Za-z]+|\d+(?:\.\d+)?', 'g')) ) AS output FROM your_table;
正则说明:
[A-Za-z]+:匹配一个或多个连续的字母(大小写都覆盖)\d+(?:\.\d+)?:匹配整数(比如123)或者浮点数(比如123.45),(?:...)是非捕获组,用来避免生成额外的分组结果|:表示“或”的逻辑,匹配两种片段中的任意一种g:全局匹配,会把字符串里所有符合规则的片段都找出来
第二种输出:将数字块+后续字母块合并为单一元素
这个方案对应你给出的alternative output,比如把12efg合并成一个元素,而单独的数字块(比如34567)和单独的字母块(比如hij)保持独立。
只需要调整正则的匹配顺序,优先匹配“数字/浮点数+字母”的组合块,再匹配单独的数字或字母块:
SELECT name, ARRAY( SELECT unnest(REGEXP_MATCHES(name, '[A-Za-z]+|\d+(?:\.\d+)?[A-Za-z]+|\d+(?:\.\d+)?', 'g')) ) AS alternative_output FROM your_table;
正则说明:
- 先匹配
[A-Za-z]+纯字母块 - 再匹配
\d+(?:\.\d+)?[A-Za-z]+:数字/浮点数后面紧跟字母的组合块 - 最后匹配单独的数字/浮点数块
\d+(?:\.\d+)?
这样正则会优先匹配更长的组合块,避免把12efg拆成两个元素。
对比你之前的方案,REGEXP_MATCH默认只匹配一次,所以只能处理包含一个数字块的场景,而REGEXP_MATCHES加g修饰符可以全局遍历整个字符串,提取所有符合规则的片段,完美覆盖所有测试案例。
内容的提问来源于stack exchange,提问作者Shh
相关产品推荐
相关产品推荐

