속도 템플릿과 유사한 Java 문자열 치환
있나요?String
Java의 치환 메커니즘에서는 객체를 텍스트로 전달할 수 있으며 문자열이 발생할 때 이를 대체할 수 있습니다.
예를 들어 텍스트는 다음과 같습니다.
Hello ${user.name},
Welcome to ${site.name}.
제가 가지고 있는 물건은"user"
그리고."site"
안에 있는 끈을 교체하고 싶습니다.${}
오브젝트로부터의 등가값으로 표시됩니다.이것은 속도 템플릿에서 개체를 교체하는 것과 같습니다.
사용하다StringSubstitutor
Apache Commons Text를 참조하십시오.
https://commons.apache.org/proper/commons-text/
고객(및 오픈 소스)을 위해 기능합니다.
Map<String, String> valuesMap = new HashMap<String, String>();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
StringSubstitutor sub = new StringSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);
클래스를 살펴봅니다. MessageFormat은 객체 세트를 가져와 포맷한 다음 포맷된 문자열을 패턴에 적절한 위치에 삽입합니다.
Object[] params = new Object[]{"hello", "!"};
String msg = MessageFormat.format("{0} world {1}", params);
선호하는 방법은 온라인 라이너로 서드파티 라이브러리가 필요하지 않기 때문입니다.
String message = String.format("Hello! My name is %s, I'm %s.", name, age);
예를 들어 다음과 같은 예외 메시지에서 정기적으로 사용합니다.
throw new Exception(String.format("Unable to login with email: %s", email));
힌트: 원하는 만큼 변수를 넣을 수 있습니다.format()
Varargs 사용
저는 이것의 작은 테스트 구현을 조립했습니다.기본적인 생각은 전화하는 것이다.format
형식 문자열, 객체 맵 및 로컬에 있는 이름을 전달합니다.
출력은 다음과 같습니다.
내 강아지의 이름은 파이도이고 제인 도가 개를 소유하고 있다.
public class StringFormatter {
private static final String fieldStart = "\\$\\{";
private static final String fieldEnd = "\\}";
private static final String regex = fieldStart + "([^}]+)" + fieldEnd;
private static final Pattern pattern = Pattern.compile(regex);
public static String format(String format, Map<String, Object> objects) {
Matcher m = pattern.matcher(format);
String result = format;
while (m.find()) {
String[] found = m.group(1).split("\\.");
Object o = objects.get(found[0]);
Field f = o.getClass().getField(found[1]);
String newVal = f.get(o).toString();
result = result.replaceFirst(regex, newVal);
}
return result;
}
static class Dog {
public String name;
public String owner;
public String gender;
}
public static void main(String[] args) {
Dog d = new Dog();
d.name = "fido";
d.owner = "Jane Doe";
d.gender = "him";
Map<String, Object> map = new HashMap<String, Object>();
map.put("d", d);
System.out.println(
StringFormatter.format(
"My dog is named ${d.name}, and ${d.owner} owns ${d.gender}.",
map));
}
}
주의: 처리되지 않은 예외로 인해 컴파일되지 않습니다.하지만 그게 코드를 읽기 훨씬 더 쉽게 만들어 주세요.
또, 코드에 직접 지도를 작성해야 하는 것은 마음에 들지 않지만, 지역 변수의 이름을 프로그램적으로 취득하는 방법을 모릅니다.가장 좋은 방법은 객체를 만드는 즉시 맵에 넣는 것입니다.
다음 예제에서는 예제에서 원하는 결과를 생성합니다.
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
Site site = new Site();
map.put("site", site);
site.name = "StackOverflow.com";
User user = new User();
map.put("user", user);
user.name = "jjnguy";
System.out.println(
format("Hello ${user.name},\n\tWelcome to ${site.name}. ", map));
}
또한 Velocity가 무엇인지 전혀 모르기 때문에 이 답변이 적절하기를 바랍니다.
다음은 이 작업을 수행하는 방법에 대한 개요입니다.실제 코드로서 실장하는 것은 비교적 간단합니다.
- 템플릿에서 참조할 모든 개체의 맵을 만듭니다.
- 정규식을 사용하여 템플릿에서 변수 참조를 찾아 값으로 대체합니다(3단계 참조).Matcher 클래스는 찾기 및 교체에 유용합니다.
- 변수 이름을 점으로 분할합니다.
user.name
될 것이다user
★★★★★★★★★★★★★★★★★」name
찾user
오브젝트를 취득하고 반사를 사용하여 값을 얻습니다.name
브젝젝오에 표준하면 getter라는 .getName
호출할 수 있습니다.
이를 실현하는 표현 언어 실장은 몇 가지 있습니다.요구가 증가했을 때 또는 증가했을 때 자체 실장을 사용하는 것이 좋습니다(예: JUEL 및 MBEL 참조).
저는 MPEL을 좋아하며 적어도 하나의 프로젝트에서 성공적으로 사용해 왔습니다.
비 JSP(스탠드 아론) 컨텍스트의 Stackflow 포스트 JSTL/JSP EL(Expression Language)도 참조해 주세요.
Handlebars.java는 Velocity와 같은 구문과 다른 서버측 템플릿 기능을 사용하는 것이 좋습니다.
http://jknack.github.io/handlebars.java/
Handlebars handlebars = new Handlebars();
Template template = handlebars.compileInline("Hello {{this}}!");
System.out.println(template.apply("Handlebars.java"));
Groovy GString에서 템플릿을 해석하기 위해 Java에서 GroovyShell을 사용합니다.
Binding binding = new Binding();
GroovyShell gs = new GroovyShell(binding);
// this JSONObject can also be replaced by any Java Object
JSONObject obj = new JSONObject();
obj.put("key", "value");
binding.setProperty("obj", obj)
String str = "${obj.key}";
String exp = String.format("\"%s\".toString()", str);
String res = (String) gs.evaluate(exp);
// value
System.out.println(str);
저는 바닐라 Java를 사용한 유틸리티를 만들었습니다.두 가지 형식이 결합되어 있습니다. {}
★★★★★★★★★★★★★★★★★」%s
String ( style ) string택 string )서을 ( style )메서드 호출로 됩니다.하나의 메서드 호출로 변환합니다. "" "" " " " " " " " " " " " " " " 를 입니다.{}
''가 ''{someWord}
.
public class LogUtils {
public static String populate(String log, Object... objects) {
log = log.replaceAll("\\{\\}", "%s");
return String.format(log, objects);
}
public static void main(String[] args) {
System.out.println(populate("x = %s, y ={}", 5, 4));;
}
}
이 문제를 해결하기 위해 속도가 작성되었기 때문에 박스에서 나온 속도만큼 빠른 것은 없습니다.가장 가까운 것은 포메터를 조사하는 것입니다.
단, 제가 알기로는 포메터는 자바에서 C라이크 포맷 옵션을 제공하기 위해 작성된 것으로 알고 있습니다.따라서 가려움증이 잘 나지 않을 수도 있지만 :)를 시도해 보세요.
언급URL : https://stackoverflow.com/questions/3655424/string-replacement-in-java-similar-to-a-velocity-template
'source' 카테고리의 다른 글
WELD-000072 수동화 범위를 선언하는 관리 빈은 수동화가 가능해야 합니다. (0) | 2022.11.08 |
---|---|
MYSQL에서 모든 테이블과 필드를 utf-8-bin 대조로 변경하는 스크립트 (0) | 2022.11.08 |
VueJS 자동화 - 테스트 카페와나이트워치 - 장점 / 단점 (0) | 2022.11.08 |
Python에서 유형을 확인하는 표준 방법은 무엇입니까? (0) | 2022.11.08 |
사용자 정의 예외 유형 (0) | 2022.11.08 |