Java-调用String的replaceAll方法替换结果错误

本文探讨了一位工程师在整理历史遗留SQL时遇到的问题,主要涉及表别名的规范化。在将al1等别名替换为更易读的形式时,遇到了正则替换导致的意料之外的转换,如al18被错误地转换为al1+“8”或al1..。通过深入源码,工程师发现是正则匹配导致的点号(.)被当作特殊字符处理,解决方案是对点号进行转义(al1.)。该问题的解决过程揭示了正则表达式在字符串替换中的重要性和潜在陷阱。
摘要由CSDN通过智能技术生成

场景:

        整理sql,历史遗留的sql中,表的别名都是用al1之类的格式写的,整理column字段时需要转化为表名字段模式。

这里将al1 表标识为 temp ,al18标识为table 方便理解。

简化sql如下 select al18.column from temp al1,table al18

业务实际经历了两个阶段,第一个阶段直接进行了替换,此阶段碰到的问题是,因为关联的表过多,replace的后出现了将al18 替换成了 al1 +“8”的情况(al18.column -> temp8.column) ,实际此情况可以通过排序解决,但我选择了另一个方式,在al1后拼接.。

这时进入了第二个阶段,发现替换后的字段变成了al18替换成了al1..(al18.column-> temp..column)的格式,发现这个问题后去查看了源码,发现先根据正则匹配,找到匹配的字符再替换,最终解决方案是将.进行转义(al1. -> al1\\.),这种方式避免了替换时按正则进行匹配。 

但是实际上还是没有理解为什么会转为..格式的数据,应该与正则有关系,在正则匹配时将.视为了受限的匹配符?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值