PostgreSQL正则表达式问题:用单个regexp_replace删除所有双字母单词
搞定单条正则删除所有双字母单词的问题
嘿,我来帮你解决这个困扰!你原来分三条语句处理开头、中间、结尾的双字母单词,想合并成一条却没成功,问题出在正则匹配时消耗了空格,导致部分情况没覆盖到,或者匹配顺序影响了结果。
正确的单条正则解决方案
试试这个语句,它能一次性处理所有位置的双字母单词:
SELECT trim(regexp_replace('UN DE DA ', '(^|\s)([A-Z]{2})(?=\s|$)', '\1', 'g'));
拆解一下这个正则的逻辑:
(^|\s):捕获字符串开头或者单个空格,替换时会保留这个部分,避免空格丢失或重复([A-Z]{2}):精准匹配你要删除的双字母大写单词(?=\s|$):正向预查,确保双字母单词后面是空格或者字符串结尾,而且不会消耗这个空格,这样后续匹配不受影响- 最后用
trim()去掉处理后可能残留的首尾空格,得到干净的结果
如果你觉得上面的正则有点复杂,也可以用更简洁的单词边界写法:
SELECT trim(regexp_replace('UN DE DA ', '\b[A-Z]{2}\b', '', 'g'));
\b是单词边界,能匹配双字母单词的前后边界,不管它在开头、中间还是结尾,替换为空后用trim()清理多余空格就行。
为什么你原来的正则没生效?
你之前写的\s{1}[A-Z]{2}\s{1}|^[A-Z]{2}\s{1}|[A-Z]{2}$有个小问题:比如你的测试字符串末尾有空格时,[A-Z]{2}$根本匹配不到结尾的DA(因为DA后面是空格,不是字符串结尾);而且匹配中间的DE时会消耗前后的空格,可能导致后续匹配逻辑出错。用零宽断言或者单词边界就能避开这些坑啦!
内容的提问来源于stack exchange,提问作者loic_midy
相关产品推荐
相关产品推荐

