자바 분석{{}변수 이름과 텍스트 내용 교체 작업
/**
*
* @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이 항목 에서 가 져 올 수 있 습 니 다.이상 의 자바 해석{{{}변수 명 및 텍스트 내용 교체 작업 은 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.많은 응원 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.