You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:00