2011-06-02 13 views
16
String delimiter = "\\*\\*"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Entry<String, String> entry : mp.entrySet()) { 
    html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

काम नहीं कर रहा है जो आमतौर पर उन दोनों तारों को प्रतिस्थापित करना चाहिए, लेकिन ऐसा नहीं है। क्या किसी के पास कोई विचार है?जावा स्ट्रिंग

+1

तुम्हें कैसे पता कि यह काम नहीं कर रहा हो? आप इसे कहीं भी प्रिंट या स्टोर नहीं कर रहे हैं। – CoolBeans

उत्तर

47

स्ट्रिंग अपरिवर्तनीय है, जिसका अर्थ है कि HTML संदर्भ नहीं बदलता है, बल्कि प्रतिस्थापन विधि एक नई स्ट्रिंग ऑब्जेक्ट देता है जिसे आपको असाइन करना है।

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
+0

बस परीक्षण किया गया, लेकिन असफल नहीं .. नए तारों को प्रतिस्थापित नहीं किया जाएगा। - संपादन: मेरे delimiter समायोजित करने के बाद, अद्भुत चला गया। – Vilius

+0

यह सही उत्तर है। – codingscientist

+0

अपरिपक्वता अपराधी थी! –

6

प्रतिस्थापन विधि अपना परिणाम देता है, जिसे आप छोड़ रहे हैं।

4

आपको * चरित्र से बचने की आवश्यकता नहीं है। replace और replaceAll के बीच अंतर यह है कि replace स्वचालित रूप से हमारे लिए कोई regex अक्षरों से परे निकल जाता है:

String delimiter = "**"; 
+0

बहुत बहुत धन्यवाद - मुझे आपको यिशई में से एक के साथ संकेत करना पड़ा। – Vilius

1

के रूप में कहा था कि आप परिणामों को त्यागकर और की जगह एक regex केवल एक शाब्दिक चार अनुक्रम नहीं ले रहे हैं को बदला जाएगा ताकि आप डॉन ' टी कोई अजीब सुनिश्चित करने के लिए Matcher.quoteReplacement(String) सीमांकक

लेकिन replaceAll और replaceFirst एक regex स्ट्रिंग लेते हैं (बुरा डिजाइन कि)

में से बचने के लिए की जरूरत है और एक अलग रूप में के रूप में यह Patter.quote(String) उपयोग करने के लिए सलाह दी जाती है और जब regex का उपयोग कर बातें हो रही हैं (यह थोड़ा आसान है और वहाँ कोई त्रुटि है सुनिश्चित करता है वर्ण से बचने में)

यहाँ जब केवल एक घटना बदला जाना चाहिए

String delimiter = "**"; 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
} 

के लिए है और यहाँ है जब अनेक गतिविधियां बदला जाना चाहिए के लिए

String delimiter = "**";//unescaped because I'm handling that in my replace 
String html = "<html><head></head><body>**USERNAME** AND **PASSWORD**</body></html>"; 
Map<String, String> mp = new HashMap<String, String>(); 
mp.put("USERNAME", "User A"); 
mp.put("PASSWORD", "B"); 
for (Map.Entry<String, String> entry : mp.entrySet()) { 
    html = html.replaceAll(Pattern.quote(delimiter + entry.getKey()+ delimiter), Matcher.quoteReplacement(entry.getValue())); 
} 
+0

उन दो उदाहरण एक ही चीज़ करते हैं – user102008

1

सादृश्य:

आप अपने डेस्कटॉप पर अपरिवर्तनीय फ़ाइल है, तो। कुछ बदलाव करने के लिए आप एक प्रतिलिपि बनाते हैं और प्रतिस्थापित करते हैं। यह उस स्थिति की ओर जाता है जिसमें आप पुरानी फ़ाइल तक नहीं पहुंच सकते हैं जब तक आपके पास बैकअप न हो।

Java, JavaScript, python और C#replace विधि को प्रतिस्थापित नहीं करता/स्ट्रिंग को संशोधित की तरह अधिकांश कंप्यूटर भाषाओं में उसी तरह। यह केवल पूर्व स्ट्रिंग पर काम करता है और सभी परिवर्तनों के साथ एक नया स्ट्रिंग देता है।

अब यदि आप वास्तव में परिवर्तनों को संग्रहित करना चाहते हैं तो आपको उसी वैरिएबल में लौटाई गई स्ट्रिंग (यदि आपकी स्थिति परमिट) या एक नए चर में प्राप्त करने की आवश्यकता होगी।

1

स्ट्रिंग अपरिवर्तनीय प्रकार है, इसलिए हम नए स्ट्रिंग द्वारा लौटाए गए बचाने के लिए स्ट्रिंग ऑब्जेक्ट नई विधि के अनुसार उसके बदले

html = html.replace(delimiter + entry.getKey()+ delimiter, entry.getValue()); 
संबंधित मुद्दे