如何用Java正则表达式替换子串的奇数次出现?
用Java正则实现奇数次
~~替换为**的方案 这个需求没法直接用replaceAll一步搞定,因为我们需要跟踪~~出现的次数,区分奇偶来做不同替换。不过借助Java正则的Matcher类的循环匹配能力,就能轻松实现。
具体实现代码
import java.util.regex.Matcher; import java.util.regex.Pattern; public class OddTildeReplacer { public static void main(String[] args) { String input = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~"; // 编译匹配"~~"的正则模式 Pattern tildePattern = Pattern.compile("~~"); Matcher matcher = tildePattern.matcher(input); StringBuffer resultBuffer = new StringBuffer(); int matchCounter = 0; // 遍历所有匹配的"~~" while (matcher.find()) { matchCounter++; // 奇数次匹配替换为**,偶数次保留原串 String replacement = (matchCounter % 2 == 1) ? "**" : "~~"; // 将替换后的内容追加到结果缓冲区 matcher.appendReplacement(resultBuffer, replacement); } // 追加匹配结束后剩余的字符串部分 matcher.appendTail(resultBuffer); // 输出最终结果 System.out.println(resultBuffer.toString()); // 预期输出: **40~~ Celsius Temp: 33 Celsius Temp:**50~~ } }
代码逻辑说明
- 正则模式:我们直接用
Pattern.compile("~~")来匹配目标子串,因为这是固定的字符串匹配,不需要复杂的正则规则。 - 计数器跟踪:通过
matchCounter变量记录每一次匹配的序号,判断奇偶性来决定替换内容。 - 结果构建:使用
StringBuffer来高效拼接结果(避免频繁字符串拼接的性能损耗),appendReplacement负责把匹配到的部分替换后加入缓冲区,appendTail则处理匹配结束后剩下的未匹配内容。
这种方式的优势在于能精确控制每一次匹配的替换行为,完全满足你“奇数次替换、偶数次保留”的需求。
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

