Có một tiêu chuẩn hoặc ít nhất là phổ biến thực hiện một cái gì đó như String.format
, nhưng với các đối số được đặt tên?Java chuỗi templatizer/định dạng với các đối số được đặt tên
Tôi muốn để định dạng một chuỗi templatized theo một cách như thế:
Map<String, Object> args = new HashMap<String, Object>();
args.put("PATH", "/usr/bin");
args.put("file", "foo");
String s = someHypotheticalMethod("#{PATH}/ls #{file}");
// "/usr/bin/ls foo"
Về mặt kỹ thuật, đó là gần như giống nhau như:
String[] args = new String[] { "/usr/bin", "foo" };
String s = String.format("%1$s/ls %2$s", args);
// "/usr/bin/ls foo"
nhưng với các đối số được đặt tên.
Tôi nhận thức được:
nhưng tất cả trong số họ sử dụng ra lệnh hoặc ít nhất là số đối số, không có tên những người thân. Tôi biết nó là tầm thường để thực hiện một, nhưng có một cơ chế tôi đang tìm kiếm trong các thư viện Java tiêu chuẩn hoặc ít nhất là trong Apache Commons/Guava/một cái gì đó tương tự, mà không mang trong công cụ mẫu cao cấp?
LƯU Ý: Tôi không thực sự quan tâm đến các công cụ mẫu toàn diện, với các tính năng như logic bắt buộc/chức năng, điều khiển luồng, công cụ sửa đổi, mẫu con/tạp chí, trình lặp, v.v. 4 dòng làm việc thực hiện - đó là tất cả tôi cần:
public static String interpolate(String format, Map<String, ? extends Object> args) {
String out = format;
for (String arg : args.keySet()) {
out = Pattern.compile(Pattern.quote("#{" + arg + "}")).
matcher(out).
replaceAll(args.get(arg).toString());
}
return out;
}
Bất kỳ lý do nào bạn không chỉ sử dụng "#" + args.get ("PATH") + "/ ls #" + args.get ("tệp")? – Charles
Tôi có một loạt các tệp mẫu, tôi có một bản đồ các đối số và tôi cần phải nhận các chuỗi được điền từ mọi tệp mẫu này. – GreyCat