如何仅替换字母之间的句点,不替换数字间的句点?
如何仅替换字母之间的句点,不替换数字间的句点?
嗨,我来帮你搞定这个问题!你之前的正则之所以出问题,是因为它把整个匹配到的“字母/数字+点+字母/数字”片段都替换成下划线了,而不是只替换中间的句点,难怪结果会乱成一团。咱们来一步步修正:
首先明确核心需求:只替换字母与字母之间的句点,数字和数字之间的句点要原封不动保留。
方案1:用零宽断言(最直接的方式)
这是最推荐的做法,因为它精准匹配到你要替换的那个句点,替换时不会影响前后的内容。
正则表达式写这个:
(?<=[a-zA-Z])\.(?=[a-zA-Z])
替换成:_
给你拆解下逻辑:
(?<=[a-zA-Z]):这是反向肯定预查,意思是“当前位置的前面必须是一个英文字母”,这样就排除了数字前面的句点;\.:就是我们要找的那个句点(要转义,因为正则里.是通配符);(?=[a-zA-Z]):这是正向肯定预查,意思是“当前位置的后面必须是一个英文字母”,这样又排除了数字后面的句点。
用这个正则去替换你的示例字符串chad.floor = 3.5,直接就能得到chad_floor = 3.5,数字中间的句点完全不会被碰。
方案2:用捕获组(兼容旧正则引擎)
如果你的开发环境里的正则引擎不支持零宽断言(现在这种情况很少见,但以防万一),可以用捕获组来保留前后的字母:
正则表达式写这个:
([a-zA-Z])\.([a-zA-Z])
替换字符串根据语言不同略有区别:
- Python、Java 这类用
\1_\2 - JavaScript、PHP 这类用
$1_$2
这个逻辑也很简单:把句点前面的字母捕获到第1组,后面的字母捕获到第2组,替换的时候把两组内容保留,中间用下划线替换原来的句点,最终效果和方案1完全一样。
为啥你之前的正则不行?
你写的"[\w*].[\w*]"有两个关键问题:
- 写法错误:方括号里的
*是普通字符,不是“任意数量”的量词,所以[\w*]是匹配“单个单词字符(字母、数字、下划线)或者*”,不是你想的“任意多个单词字符”; - 范围太宽:
\w包含数字,所以就算写法对了,也会把数字之间的句点(比如3.5里的点)也匹配到,而且你是把整个匹配片段替换成下划线,自然会把前后的字母都删掉,出现___r = _5这种奇怪结果。
备注:内容来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

