PostgreSQL如何按多规则拆分含::分隔符的驼峰命令字符串
Postgres字符串拆分实现方案
你可以直接使用Postgres内置的regexp_match()正则匹配函数完成剩余字段的拆分,具体实现逻辑如下:
核心正则规则
针对你给出的字符串格式,我们可以通过分组正则匹配一次性定位所有需要提取的片段:
^([^:]+)::([A-Z][a-z]+)([A-Z][a-z]+)([A-Z][a-z]+)?Command$
各分组对应你的拆分规则:
- 分组1:第一个冒号前的内容(你已实现的第一步结果)
- 分组2:
::之后第一个大写开头的连续小写字符,对应规则2要求的Create、Update - 分组3:紧接着分组2之后的下一个大写开头连续小写字符,对应示例中的
User、Person - 分组4:剩余的大写开头字符(排除末尾的
Command),无内容时返回NULL
完整SQL示例
假设存储命令字符串的表名为command_table,字段名为command_content,查询语句如下:
SELECT -- 第二部分:匹配::之后第一个大写开头单词 (regexp_match(command_content, '::([A-Z][a-z]+)'))[1] AS part2, -- 第三部分:匹配第二个大写开头单词 (regexp_match(command_content, '::[A-Z][a-z]+([A-Z][a-z]+)'))[1] AS part3, -- 第四部分:匹配除Command外的剩余大写开头单词,无内容返回NULL nullif((regexp_match(command_content, '::[A-Z][a-z]+[A-Z][a-z]+([A-Z][a-z]+)?Command$'))[1], '') AS part4 FROM command_table;
如果需要直接输出逗号拼接的结果,可以使用concat_ws函数:
SELECT concat_ws(', ', -- 你已实现的第一部分字段可以直接替换这里的第一个参数 (regexp_match(command_content, '^([^:]+)::'))[1], (regexp_match(command_content, '::([A-Z][a-z]+)'))[1], (regexp_match(command_content, '::[A-Z][a-z]+([A-Z][a-z]+)'))[1], coalesce(nullif((regexp_match(command_content, '::[A-Z][a-z]+[A-Z][a-z]+([A-Z][a-z]+)?Command$'))[1], ''), 'NULL') ) AS split_result FROM command_table;
运行后输出和你预期完全一致:
- User, Create, User, NULL
- Person, Update, Person, Kommunikation
内容的提问来源于stack exchange,提问作者user2210516
相关产品推荐
相关产品推荐

