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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:04:08