天天看點

String replaceAll()踩過的坑。

問題描述

想做一個模闆動态替換的功能

//${} 中為類字段名稱。可以動态擷取值替換到模闆
String template = "于${subTime}已轉發給${receiverOrgName}${receiverName}(${receiver})";
           

看起來用String的replaceAll()可以輕松搞定。然而還是太年輕。由于#,$,{都是特殊字元。一開始沒有轉義,就會報如下的異常

java.util.regex.PatternSyntaxException: Illegal repetition

網上找了半天,都說需要轉義。然鵝。我用string 直接轉義以及 stringbuilder.append()組合還是會報錯。

錯誤代碼

String template = ""; //入參
String o ="" ; //是需要替換進去的子串
  StringBuilder regexBuilder = new StringBuilder();
            regexBuilder.append("\\$\\{").append(originFieldName).append("}");
            log.info("regexBuilder=={}", regexBuilder);
            result = template.replaceAll(regexBuilder.toString(), o);
           

解決辦法

試了老半天。都沒用。笨辦法解決。代碼如下:

StringBuilder builder1 = builder;//原始的串
			//循環中的邏輯
            int startRep = builder1.indexOf("${");
            int endRep = builder1.indexOf("}") + 1;
            log.info("builder1=={}", builder1);
            log.info("startRep=={}", startRep);
            log.info("endRep=={}", endRep);

            builder1.replace(startRep, endRep, o);