overlaps आप निम्नलिखित स्ट्रिंग है कहते हैं:जावा में एक से अधिक सबस्ट्रिंग की जगह जब प्रतिस्थापन पाठ खोज पाठ
cat dog fish dog fish cat
आप dogs
के साथ सभी cats
, fish
के साथ सभी dogs
, और cats
के साथ सभी fish
बदलना चाहते हैं। Intuitively, अपेक्षित परिणाम:
dog fish cat fish cat dog
आप स्पष्ट समाधान की कोशिश करते हैं, तो replaceAll()
साथ के माध्यम से पाशन, आपको मिलता है:
- (मूल)
cat dog fish dog fish cat
- (बिल्ली -> कुत्ता)
dog dog fish dog fish dog
- (कुत्ता -> मछली)
fish fish fish fish fish fish
- (मछली -> बिल्ली)
cat cat cat cat cat cat
स्पष्ट रूप से, यह इच्छित परिणाम नहीं है। तो ऐसा करने का सबसे आसान तरीका क्या है? मैं Pattern
और Matcher
(और Pattern.quote()
और Matcher.quoteReplacement()
) के साथ कुछ एक साथ जोड़ सकता हूं, लेकिन मुझे विश्वास है कि मैं इस समस्या के लिए पहला व्यक्ति हूं और इसे हल करने के लिए कोई लाइब्रेरी फ़ंक्शन नहीं है।
(Fwiw, वास्तविक मामले में थोड़ा और अधिक जटिल है और सीधे स्वैप शामिल नहीं है।)
कम से कम स्ट्रिंगयूट्स 2.5 और इससे पहले में स्पष्ट रूप से वर्जित किया गया है: "फेंकता है: अवैध अर्ग्यूमेंट अपवाद - यदि खोज दोहराई जा रही है और किसी के इनपुट के आउटपुट के कारण अंतहीन पाश है"। (हालांकि मुझे वास्तव में जो मिलता है वह एक अवैध स्टाइल अपवाद है क्योंकि रिकर्सन ठीक से रुकने में विफल रहता है।) –
मैं उलझन में हूं। जिस विधि को मैंने ऊपर उद्धृत किया है (जिसे मैंने सीधे ऑनलाइन जावाडॉक्स से कॉपी किया है) भी बाहर नहीं निकलता है। अंतिम बुलियन पैरामीटर के साथ कोई प्रतिस्थापन नहीं है। दूसरी ओर 'StringUtils.replaceEach ("abcde", नया स्ट्रिंग [] {"ab", "cd"}, नया स्ट्रिंग [] {"cd", "ab"})' रिटर्न '"cdabe" 'जो लगता है सही होना। मैंने इसे 2.5 –
पर ठीक किया, कुछ स्पष्टता। 'eERepeatedly' को बदलें 'IllegalStateException' जैसे आपने लिखा था। पिछले 'बूलियन' पैरामीटर के साथ 'प्रतिस्थापित करें' मौजूद नहीं है। पिछले 'बूलियन 'पैरामीटर के बिना' replaceEach' 'नौकरी करना प्रतीत होता है। –