Oracle SQL REGEXP_REPLACE实现点号后按需添加空格的问题
解决正则替换问题:仅在点号后为字母/数字时添加空格
你的问题出在正则表达式的基础用法上——在正则语法里,.是匹配任意单个字符的通配符,所以你原来的语句会把每一个字符都替换成. ,完全偏离了需求方向。
要实现目标,我们需要精准匹配后面紧跟字母或数字的点号,再把这个点号替换成. ,其他点号保持不变。这里要用到正则的**正向预查(Positive Lookahead)**语法,它能帮我们判断点号后面的字符是否符合条件,且不会把后面的字符包含在匹配内容里。
针对不同数据库的正确SQL写法
MySQL 8.0+ / MariaDB
SELECT REGEXP_REPLACE(expCol, '\\.(?=[a-zA-Z0-9])', '. ') AS expCol FROM expTable;
\\.:转义点号,因为原生点号是通配符,这里要匹配字面意义的.(?=[a-zA-Z0-9]):正向预查,确保当前位置(点号之后)的字符是字母或数字- MySQL默认全局替换,无需额外参数
PostgreSQL
SELECT REGEXP_REPLACE(expCol, '\.(?=[a-zA-Z0-9])', '. ', 'g') AS expCol FROM expTable;
'g'参数表示全局替换(如果一行里有多个符合条件的点号,都会被处理)- PostgreSQL里正则转义只用单个反斜杠即可
Oracle
SELECT REGEXP_REPLACE(expCol, '\.(?=[a-zA-Z0-9])', '. ') AS expCol FROM expTable;
- Oracle的正则函数默认全局匹配,写法和PostgreSQL类似
验证结果
执行上述语句后,你的表数据会得到预期输出:
+--------+ |expCol | +--------+ |abc. abc| |bcd. 123| |efg.@/. | +--------+
- 第一行点号后是字母
a,符合条件,添加空格 - 第二行点号后是数字
1,符合条件,添加空格 - 第三行的两个点号,第一个后是
@、第二个后是字符串结尾,都不符合字母/数字的条件,所以保持原样
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

