자바 분석{{}변수 이름과 텍스트 내용 교체 작업

문자 메 시 지 를 보 내 거나 메 일 을 보 낼 때 템 플 릿 내용 을 실제 데이터 로 바 꿔 야 하 는 문제 가 자주 발생 합 니 다.본 고 는 텍스트 템 플 릿 에서 변수 목록 을 분석 하고 매개 변 수 를 입력 한 후에 실제 텍스트 내용 을 얻 는 방법 을 소개 합 니 다.

/**
 *                   
 * @param pattern
 * @param content
 * @return
 */
public static List<String> getParams(String pattern, String content) {
 Pattern p = Pattern.compile(pattern);
 Matcher m = p.matcher(content);
 
 List<String> result = new ArrayList<String>();
 while (m.find()) {
  result.add(m.group(1));
 }
 return result;
}
 
/**
 *                               
 * @param pattern
 * @param content
 * @param data
 * @return
 */
public static String parse(String pattern, String content, Map<String, String> data) {
 Pattern p = Pattern.compile(pattern);
 Matcher m = p.matcher(content);
 
 StringBuffer sb = new StringBuffer();
 while (m.find()) {
  String key = m.group(1);
  String value = data.get(key);
  m.appendReplacement(sb, value == null ? "" : value);
 }
 m.appendTail(sb);
 return sb.toString();
}
 
public static void main(String[] args) {
 String content = "  {{  }}    ,      {[code]}       ";
 String reg = "\\{\\{(.+?)\\}\\}";
 List<String> params = getParams(reg, content);
 System.out.println(params);
 
 Map<String, String> data = new HashMap<String, String>();
 data.put("  ", "   ");
 data.put("code", "930118");
 String text = parse(reg, content, data);
 System.out.println(text);
}
위의 코드 는{{}형식의 변수 값 을 분석 하 는 방법 을 소개 합 니 다.정규 표현 식 을 수정 하여${}변 수 를 분석 할 수 있 는 방법 으로 바 꿀 수 있 습 니 다.
추가 지식:자바 템 플 릿 문자열 우아 한 해석(자리 차지 문자 분석)
프로젝트 에 서 는 사용자:{userId}:{userType}redis 에 사용 되 는 key 등 문자열 템 플 릿 을 분석 해 야 합 니 다.흔히 볼 수 있 는 방법 은 String.format("user:%s:%s",1,1)방법 을 사용 하 는 것 입 니 다.그러나 개인 적 으로 그런 템 플 릿 이 명확 하지 않다 고 생각 합 니 다.템 플 릿 분석 기 를 사용 하면 이러한 문자열 을 분석 하 는 데 도움 이 됩 니 다.
맵 을 사용 하여 분석 할 수도 있 고,대상 을 사용 하여 분석 할 수도 있 으 며,String.format 와 유사 한 가 변 매개 변 수 를 사용 하여 분석 할 수도 있 으 며,대상 값 을 다양화 할 수도 있 습 니 다.js 템 플 릿 문자열${}과 유사 합 니 다.
접두사 접 두 사 를 사용자 정의 하여 해석 할 수 있 습 니 다.예 를 들 어 Placeholder Resolver.getResolver("{","}")이 대상 은{}이 유형의 대체 자 를 분석 할 수 있 습 니 다.
성능:


Placeholder Resolve 분석 결과
String.format 분석 결과
100 w 회 분석,자리 표시 자 분석 은 String.format 보다 평균 0.4~0.5s 빠 르 며,so 성능 에 문제 가 없 을 것 입 니 다.가장 중요 한 것 은 너무 많은 대상 방법 을 호출 하지 않 아 도 되 고 자동 으로 해석 하여 편리 하고 빠르다 는 것 이다.
원본 코드 는 다음 과 같 습 니 다:

/**
 *       
 *
 * @author meilin.huang
 * @version 1.0
 * @date 2018-11-13 1:42 PM
 */
public class PlaceholderResolver {
 /**
  *        
  */
 public static final String DEFAULT_PLACEHOLDER_PREFIX = "${";

 /**
  *        
  */
 public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}";

 /**
  *        
  */
 private static PlaceholderResolver defaultResolver = new PlaceholderResolver();

 /**
  *      
  */
 private String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX;

 /**
  *      
  */
 private String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX;


 private PlaceholderResolver(){}

 private PlaceholderResolver(String placeholderPrefix, String placeholderSuffix) {
  this.placeholderPrefix = placeholderPrefix;
  this.placeholderSuffix = placeholderSuffix;
 }

 /**
  *            ,       "${",    "}"
  * @return
  */
 public static PlaceholderResolver getDefaultResolver() {
  return defaultResolver;
 }

 public static PlaceholderResolver getResolver(String placeholderPrefix, String placeholderSuffix) {
  return new PlaceholderResolver(placeholderPrefix, placeholderSuffix);
 }

 /**
  *                ,        :${   :}<br/><br/>
  *  :template = category:${}:product:${}<br/>
  * values = {"1", "2"}<br/>
  *    category:1:product:2<br/>
  *
  * @param content                
  * @param values                  
  * @return
  */
 public String resolve(String content, String... values) {
  int start = content.indexOf(this.placeholderPrefix);
  if (start == -1) {
   return content;
  }
  //   
  int valueIndex = 0;
  StringBuilder result = new StringBuilder(content);
  while (start != -1) {
   int end = result.indexOf(this.placeholderSuffix);
   String replaceContent = values[valueIndex++];
   result.replace(start, end + this.placeholderSuffix.length(), replaceContent);
   start = result.indexOf(this.placeholderPrefix, start + replaceContent.length());
  }
  return result.toString();
 }

 /**
  *                ,        :${   :}<br/><br/>
  *  :template = category:${}:product:${}<br/>
  * values = {"1", "2"}<br/>
  *    category:1:product:2<br/>
  *
  * @param content                
  * @param values                  
  * @return
  */
 public String resolve(String content, Object[] values) {
  return resolve(content, Stream.of(values).map(String::valueOf).toArray(String[]::new));
 }

 /**
  *                    
  * @param content        
  * @param rule       
  * @return
  */
 public String resolveByRule(String content, Function<String, String> rule) {
  int start = content.indexOf(this.placeholderPrefix);
  if (start == -1) {
   return content;
  }
  StringBuilder result = new StringBuilder(content);
  while (start != -1) {
   int end = result.indexOf(this.placeholderSuffix, start);
   //        , ${id},    id
   String placeholder = result.substring(start + this.placeholderPrefix.length(), end);
   //         ,  ${id}              
   String replaceContent = placeholder.trim().isEmpty() ? "" : rule.apply(placeholder);
   result.replace(start, end + this.placeholderSuffix.length(), replaceContent);
   start = result.indexOf(this.placeholderPrefix, start + replaceContent.length());
  }
  return result.toString();
 }

 /**
  *           ,        map key    ,key        。<br/><br/>
  *  :content = product:${id}:detail:${did}<br/>
  * valueMap = id -> 1; pid -> 2<br/>
  *        product:1:detail:2<br/>
  *
  * @param content     。
  * @param valueMap    
  * @return          。
  */
 public String resolveByMap(String content, final Map<String, Object> valueMap) {
  return resolveByRule(content, placeholderValue -> String.valueOf(valueMap.get(placeholderValue)));
 }

 /**
  *   properties         
  * @param content
  * @param properties
  * @return
  */
 public String resolveByProperties(String content, final Properties properties) {
  return resolveByRule(content, placeholderValue -> properties.getProperty(placeholderValue));
 }

 /**
  *          (   js       )          <br/><br/>
  *   content = product:${id}:detail:${detail.id} <br/>
  * obj = Product.builder().id(1).detail(Detail.builder().id(2).build()).build(); <br/>
  *        product:1:detail:2 <br/>
  *
  * @param content       
  * @param obj          (       ,             )
  * @return
  */
 public String resolveByObject(String content, final Object obj) {
  if (obj instanceof Map) {
   return resolveByMap(content, (Map)obj);
  }
  return resolveByRule(content, placeholderValue -> String.valueOf(ReflectionUtils.getValueByFieldPath(obj, placeholderValue)));
 }
}
코드 가 일부 도구 류 의 호출 이 있 기 때문에 지면 문제 로 붙 이지 않 았 습 니 다.필요 하 다 면https://gitee.com/objs/mayfly이 항목 에서 가 져 올 수 있 습 니 다.
이상 의 자바 해석{{{}변수 명 및 텍스트 내용 교체 작업 은 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.많은 응원 바 랍 니 다.

좋은 웹페이지 즐겨찾기