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
相关产品推荐
相关产品推荐

