2009-08-05 16 views
51

जावा का उपयोग करके, मैं एक टेक्स्ट की रेखाओं से गुज़रना चाहता हूं और एक्सएमएल इकाई संदर्भ & के साथ सभी एम्पर्सेंड प्रतीकों (&) को प्रतिस्थापित करना चाहता हूं।मैं जावा में स्ट्रिंग में किसी वर्ण को कैसे बदलूं?

मैं पाठ की रेखाओं को स्कैन करता हूं और फिर स्कैनर कक्षा के साथ पाठ में प्रत्येक शब्द स्कैन करता हूं। फिर मैं शब्द के प्रत्येक अक्षर पर दोहराने के लिए CharacterIterator का उपयोग करता हूं। हालांकि, मैं चरित्र को कैसे बदल सकता हूं? सबसे पहले, स्ट्रिंग्स अपरिवर्तनीय वस्तुएं हैं। दूसरा, मैं कई पात्रों (amp&;) के साथ एक वर्ण (&) को प्रतिस्थापित करना चाहता हूं। मुझे इस बात से कैसे संपर्क करना चाहिए?

CharacterIterator it = new StringCharacterIterator(token); 
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) { 
     if(ch == '&') { 

     } 
} 

उत्तर

100

इसके बजाय String.replaceAll() का उपयोग करने का प्रयास करें।

String my_new_str = my_str.replaceAll("&", "&"); 
+61

replaceAll से सावधान रहें , क्योंकि यह नियमित अभिव्यक्ति के रूप में अपने पहले तर्क का उपयोग करता है। अर्थात। "h.e.l.l.o" .replaceAll ("।", ",") आपको ",,,,,,," देगा! जावा 1.5 में नई स्ट्रिंग.रेप्लेस (CharSequence, CharSequence) विधि है, जो कुछ समान करती है, लेकिन नियमित अभिव्यक्ति के रूप में पहली तर्क की व्याख्या नहीं करती है। –

14
StringBuilder s = new StringBuilder(token.length()); 

CharacterIterator it = new StringCharacterIterator(token); 
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) { 
    switch (ch) { 
     case '&': 
      s.append("&"); 
      break; 
     case '<': 
      s.append("&lt;"); 
      break; 
     case '>': 
      s.append("&gt;"); 
      break; 
     default: 
      s.append(ch); 
      break; 
    } 
} 

token = s.toString(); 
+1

आपको इस परिदृश्य में एक स्ट्रिंगबफर की आवश्यकता नहीं है। –

+1

इसके बजाय स्ट्रिंग का उपयोग करने से प्रति अस्थायी स्ट्रिंग ऑब्जेक्ट का निर्माण होगा। मुझे यकीन नहीं है कि आप किस विकल्प का सुझाव देंगे। –

+0

string.replaceAll? – IRBMe

4

बस एक स्ट्रिंग है कि प्रश्न में डेटा के सभी शामिल हैं और फिर नीचे की तरह String.replaceAll() का उपयोग पैदा करते हैं।

String result = yourString.replaceAll("&", "&amp;"); 
+0

यदि डेटा बहुत बड़ा है, तो सभी डेटा से युक्त एक स्ट्रिंग बनाना हानिकारक हो सकता है। हम लाइन-दर-रेखा भी कर सकते हैं। – Bhushan

+0

इस मामले में replaceAll का उपयोग करना गलत है! यदि संभव हो, तो हमेशा प्रतिस्थापित करने के बजाय प्रतिस्थापित करें। यह अधिक कुशल और कम त्रुटि प्रवण है। –

0

this विधि पर एक नज़र डालें।

+0

प्रतिस्थापित करने के लिए पैरामीटर प्रकारों पर ध्यान दें (चार, चार) - यह सिंगल-कैरेक्टर प्रतिस्थापन करता है। – Amber

+0

हाँ हाँ, पोस्ट के तुरंत बाद तय किया गया। – IRBMe

+0

मुझे लगता है कि आपको इसे जोड़ने के लिए [1] अपने लिंक पर इंडेंट करना होगा ... शायद? –

0

यदि आप वसंत का उपयोग कर रहे हैं तो आप आसानी से HtmlUtils.htmlEscape(String input) पर कॉल कर सकते हैं जो '' से & 'अनुवाद को संभालेगा।

+0

यह जोखिम भरा है क्योंकि HTML में शुद्ध एक्सएमएल की तुलना में परिभाषित कई और इकाइयां हैं। –

1

तारों से बचने can be tricky - खासकर अगर आप खाते में यूनिकोड लेना चाहते हैं। मुझे लगता है कि एक्सएमएल बचने के लिए सरल प्रारूपों/भाषाओं में से एक है लेकिन अभी भी। मैं Apache Commons Lang में StringEscapeUtils क्लास को देखने और इसकी आसान escapeXml विधि को देखने की अनुशंसा करता हूं।

7

आप यह भी सुनिश्चित करने के लिए जांचना चाहेंगे कि आप किसी ऐसी घटना को प्रतिस्थापित नहीं कर रहे हैं जो पहले से ही बदला जा चुका है। ऐसा करने के लिए आप नकारात्मक अभिव्यक्ति के साथ एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं।

उदाहरण के लिए:

String str = "sdasdasa&amp;adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&amp;");

इस स्ट्रिंग "sdasdasa & adas & dasdasa" में परिणाम होगा। "(?! Amp;) &"

regex पैटर्न मूल रूप से कहते हैं: '&' है कि के बाद नहीं है की किसी भी घटना का मिलान करें 'amp;'।

82

सरल जवाब है:

token = token.replace("&", "&amp;"); 

नाम के बावजूद replaceAll की तुलना में, की जगह एक replaceAll क्या करता है, यह सिर्फ एक नियमित अभिव्यक्ति है, जो यहां के क्रम में हो रहा है का उपयोग नहीं करता (दोनों से एक प्रदर्शन और एक अच्छा अभ्यास परिप्रेक्ष्य - दुर्घटना से नियमित अभिव्यक्तियों का उपयोग न करें क्योंकि उनके पास विशेष चरित्र आवश्यकताएं हैं जिन्हें आप ध्यान नहीं देंगे)।

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

कहा जा रहा है कि यहां कुछ गहरी संभावित समस्या है। पात्रों से बचने के लिए एक ज्ञात समस्या है जो वहां कई पुस्तकालयों का पता है। आप एक्सएमएल में सीडीएटीए सेक्शन में डेटा को लपेटने पर विचार करना चाह सकते हैं, या आप वास्तव में एक्सएमएल को ठीक से उत्पन्न करने के लिए एक्सएमएल लाइब्रेरी (जिसमें जेडीके के साथ आता है) का उपयोग करना पसंद कर सकते हैं (ताकि यह एन्कोडिंग को संभालेगा)।

अपाचे में कॉमन्स लैंग के हिस्से के रूप में escaping library भी है।

0
//I think this will work, you don't have to replace on the even, it's just an example. 

public void emphasize(String phrase, char ch) 
    { 
     char phraseArray[] = phrase.toCharArray(); 
     for(int i=0; i< phrase.length(); i++) 
     { 
      if(i%2==0)// even number 
      { 
       String value = Character.toString(phraseArray[i]); 
       value = value.replace(value,"*"); 
       phraseArray[i] = value.charAt(0); 
      } 
     } 
    } 
1

इस कोड को आजमाएं। आप किसी भी चरित्र को किसी अन्य वर्ण के साथ प्रतिस्थापित कर सकते हैं। "-" चरित्र दे स्ट्रिंग "abcdeaa"

उत्पादन के लिए - यहाँ मैं 'एक' साथ पत्र को बदलने के लिए करने की कोशिश की> _ bcdef__

public class Replace { 

    public static void replaceChar(String str,String target){ 
     String result = str.replaceAll(target, "_"); 
     System.out.println(result); 
    } 

    public static void main(String[] args) { 
     replaceChar("abcdefaa","a"); 
    } 

} 
संबंधित मुद्दे