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

Java如何替换字符串中大括号包裹的内容并去除外层大括号

Java模板占位符{xxx}替换方案

报错原因

  • String.replaceAll() 第一个参数要求传入正则表达式,{ 是正则元字符,用于表示量词范围,没有转义直接传入会触发PatternSyntaxException模式语法异常。
  • 你对方法的调用记忆有误:JDK的String类没有入参为两个char的replaceAll重载,你实际调用的是入参为两个String的replaceAll重载,传了单字符字符串作为参数。
  • 你写的正则表达式在Java语法中不正确:Java字符串里的反斜杠需要二次转义,"\{(.*?)\}" 会直接编译报错,正确的正则写法是 "\\{(.*?)\\}"。

解决方案

场景1:仅需要删除所有占位符的大括号,不需要按key匹配不同值

直接调用String.replace()方法即可,这个方法是按普通字符串全文匹配替换,不会解析正则语法,不会触发异常:

// 直接删除所有{和}字符
String result = text.replace("{", "").replace("}", "");

执行后Hello {yourname}!就会直接变成你期望的Hello yourname!。

场景2:需要通用占位符替换,不同key对应不同实际值

如果后续要扩展支持多个不同占位符(比如{age}、{phone}等),可以用你已经创建的Matcher实现动态匹配替换,示例代码如下:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PlaceholderReplace {
    public static void main(String[] args) {
        String text = "Hello {yourname}!";
        // 定义占位符key和实际值的映射,可按需扩展
        Map<String, String> valueMap = new HashMap<>();
        valueMap.put("yourname", "yourname"); // 这里替换为你实际的变量值

        Matcher matcher = Pattern.compile("\\{(.*?)\\}").matcher(text);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String key = matcher.group(1);
            // 取对应值,找不到则保留原占位符避免内容丢失
            String replaceValue = valueMap.getOrDefault(key, matcher.group());
            // quoteReplacement用于处理替换值里的$、\等特殊字符,避免异常
            matcher.appendReplacement(sb, Matcher.quoteReplacement(replaceValue));
        }
        matcher.appendTail(sb);
        String result = sb.toString();
        System.out.println(result); // 输出 Hello yourname!
    }
}

内容的提问来源于stack exchange,提问作者user16028444

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:45:04