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

Postgres regexp_replace双匹配条件正则语法求助

解决PostgreSQL中整合regexp_replace的两个正则规则问题

首先,你已经完成了第一个规则的正则,现在要把两个规则整合起来很简单——用|(逻辑或)把两个条件的正则分支合并到同一个捕获组里就行。

第一步:整合两个字符替换规则

你的两个规则可以合并成一个正则模式,匹配非2之后的A/C或者非4之后的D/F,然后在匹配到的字符后插入分号:

SELECT regexp_replace(
    '1ABC 2ABC 3DEF 4DEF',
    '((?<!2)(A|C)|(?<!4)(D|F))',
    '\1;',
    'g'
);

执行这段代码后,你会得到:1A;BC; 2ABC 3D;EF; 4DEF——这已经处理了大部分需求,但还没达到你的期望输出,因为2ABC和4DEF的末尾还缺分号。

第二步:补充单词末尾的分号

观察你的期望输出,我们需要给那些没被上面规则处理的单词末尾(也就是2后面的C、4后面的F)加上分号。可以再套一层regexp_replace来匹配单词末尾的A/C/D/F(且后面是空格或字符串结尾),补充分号:

SELECT regexp_replace(
    regexp_replace(
        '1ABC 2ABC 3DEF 4DEF',
        '((?<!2)(A|C)|(?<!4)(D|F))',
        '\1;',
        'g'
    ),
    '([ACDF])(?=\s|$)',
    '\1;',
    'g'
);

执行这段代码后,就能得到你想要的结果:1A;BC; 2ABC; 3D;EF; 4DEF;

为什么这样可行?

  • 第一层替换处理了所有符合规则的字符:非2后的A/C、非4后的D/F,在它们后面插入分号;
  • 第二层替换专门针对单词末尾的A/C/D/F(也就是那些因为前缀是2或4没被第一层处理的字符),在它们后面补充分号,同时不会影响已经加过分号的字符(因为它们后面已经有分号,不再符合(?=\s|$)的匹配条件)。

内容的提问来源于stack exchange,提问作者user2635921

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:18