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
相关产品推荐
相关产品推荐

