उत्तर के लिए सभी को धन्यवाद!
Gizmo का उत्तर निश्चित रूप से बॉक्स से बाहर था, और एक अच्छा समाधान था, लेकिन दुर्भाग्य से उचित नहीं है क्योंकि प्रारूप इस मामले में फ़ॉर्मेटर वर्ग के लिए सीमित नहीं हो सकता है।
एडम पेन्टर वास्तव में सही पैटर्न के साथ इस मामले के दिल में पहुंचे।
पीटर निक्स और शॉन ब्राइट ने रेगेक्स की सभी जटिलताओं से बचने के लिए एक अच्छा कामकाज किया था, लेकिन अगर खराब टोकन थे तो मुझे कुछ त्रुटियां उठाने की ज़रूरत थी, जो ऐसा नहीं करते थे।
लेकिन दोनों रेगेक्स और उचित प्रतिस्थापन लूप करने के मामले में, यह वह उत्तर है जिसके साथ मैं आया था (Google और थोड़ी सी मदद के साथ, समूह का उपयोग कैसे करें (1) के बारे में शॉन ब्राइट की टिप्पणी सहित बनाम समूह()):
private static Pattern tokenPattern = Pattern.compile("\\{([^}]*)\\}");
public static String process(String template, Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
Matcher myMatcher = tokenPattern.matcher(template);
while (myMatcher.find()) {
String field = myMatcher.group(1);
myMatcher.appendReplacement(sb, "");
sb.append(doParameter(field, params));
}
myMatcher.appendTail(sb);
return sb.toString();
}
कहाँ doParameter नक्शे से बाहर निकलने मूल्य हो जाता है और एक स्ट्रिंग में बदल देता है और एक अपवाद फेंकता है तो यह वहाँ नहीं है।
नोट भी मैंने खाली ब्रेसिज़ (यानी {}) खोजने के लिए पैटर्न बदल दिया, क्योंकि यह एक त्रुटि स्थिति स्पष्ट रूप से जांच की गई है।
संपादित करें:
ध्यान दें कि संलग्न करना स्ट्रिंग की सामग्री के बारे में अज्ञात नहीं है। Javadocs के अनुसार, यह एक विशेष चरित्र के रूप में $ और बैकस्लैश को पहचानता है, इसलिए मैंने उपरोक्त नमूने को संभालने के लिए कुछ भागने को जोड़ा। सबसे प्रदर्शन जागरूक तरीके से नहीं किया गया है, लेकिन मेरे मामले में यह स्ट्रिंग क्रिएशन को माइक्रो-ऑप्टिमाइज़ करने का प्रयास करने के लायक होने का एक बड़ा सौदा नहीं है।
एलन एम से टिप्पणी के लिए धन्यवाद, इसे एपेंड रिप्लेसमेंट के विशेष चरित्र मुद्दों से बचने के लिए और भी आसान बनाया जा सकता है।
http://github.com/niesfisch/tokenreplacer/ – Marcel