Oracle中如何用符号替换单词中间字符,保留首尾字符?
在Oracle中用REGEXP_REPLACE实现保留单词首尾字符、替换中间内容的方案
原方案的问题
你尝试的REGEXP_REPLACE('ANNE MARRY', '(\w)\w', '\1*')无法得到期望结果。这个正则的逻辑是匹配连续两个单词字符,捕获第一个,将第二个替换为*,执行后会把ANNE变成A*N*,MARRY变成M*R*Y,和目标输出完全不符。
可行的REGEXP_REPLACE解决方案
REGEXP_REPLACE是完全可行的,只需要调整正则表达式,精准匹配每个单词的中间字符(即既不是单词第一个、也不是最后一个的字符)。
正确语句
SELECT REGEXP_REPLACE('Anne Marry', '(?<=\w)\w(?=\w)', '*') AS result FROM dual;
执行结果
该语句会输出:A••e M•••y,完全符合你的期望。
正则逻辑说明
(?<=\w):正向反向预查,确保当前字符的前一个字符是单词字符(\w,等价于[A-Za-z0-9_]),也就是当前字符不是单词的第一个字符。\w:匹配需要替换的中间字符。(?=\w):正向预查,确保当前字符的后一个字符是单词字符,也就是当前字符不是单词的最后一个字符。
通过这两个预查条件,就能精准定位到每个单词内部的所有中间字符,将它们逐个替换为*,同时保留首尾字符不变。
特殊情况兼容
如果遇到长度为1的单词(比如输入包含"A"),该正则不会进行任何替换,直接保留原字符;长度为2的单词(比如"Ab"),因为没有中间字符,也会原样保留,符合预期。
内容的提问来源于stack exchange,提问作者Anne.07
相关产品推荐
相关产品推荐

