TLDR: theString = theString.replace("\\", "\\\\");इसके बजाय का उपयोग करें ।
संकट
replaceAll(target, replacement)के लिए targetऔर आंशिक रूप से के लिए नियमित अभिव्यक्ति (रेगेक्स) वाक्यविन्यास का उपयोग करता है replacement।
समस्या यह है कि \रेगेक्स में विशेष चरित्र है (इसका उपयोग \dअंक का प्रतिनिधित्व करने के लिए किया जा सकता है ) और स्ट्रिंग शाब्दिक में (इसका उपयोग "\n"लाइन विभाजक का प्रतिनिधित्व \"करने के लिए या दोहरे उद्धरण चिन्ह से बचने के लिए किया जा सकता है जो आमतौर पर स्ट्रिंग शाब्दिक के अंत का प्रतिनिधित्व करता है)।
\प्रतीक बनाने के लिए इन दोनों मामलों में हम इससे पहले अतिरिक्त रखकर (जैसे हम स्ट्रिंग साहित्यिकों में बचते हैं ) से बच सकते हैं (विशेष चरित्र के बजाय इसे शाब्दिक बना सकते हैं )।\"\"
तो प्रतीक का targetप्रतिनिधित्व करने के लिए regex \को पकड़ना होगा \\, और ऐसे पाठ का प्रतिनिधित्व करने वाले स्ट्रिंग शाब्दिक को देखने की आवश्यकता होगी "\\\\"।
इसलिए हम \दो बार भाग निकले :
- एक बार regex में
\\
- एक बार स्ट्रिंग शाब्दिक में
"\\\\"(प्रत्येक \का प्रतिनिधित्व किया जाता है "\\")।
के मामले में replacement \भी खास है। यह हमें अन्य विशेष चरित्र से बचने की अनुमति देता है, $जो $xसंकेतन के माध्यम से , हमें regex द्वारा मिलान किए गए डेटा के हिस्से का उपयोग करने की अनुमति देता है और समूह द्वारा अनुक्रमित कैप्चरिंग के रूप में आयोजित किया जाता है x, जैसे "012".replaceAll("(\\d)", "$1$1")कि प्रत्येक अंक से मेल खाएगा, इसे कैप्चरिंग ग्रुप 1 में रखें और $1$1इसे अपनी दो प्रतियों के साथ बदल देगा। (यह इसे डुप्लिकेट करेगा) जिसके परिणामस्वरूप "001122"।
तो फिर, शाब्दिक replacementप्रतिनिधित्व \करने के लिए हमें इसे अतिरिक्त के साथ भागने की आवश्यकता है \जिसका अर्थ है:
- प्रतिस्थापन में दो बैकस्लैश वर्ण होने चाहिए
\\
- और स्ट्रिंग शाब्दिक जो प्रतिनिधित्व करता
\\है जैसा दिखता है"\\\\"
लेकिन जब से हम दो बैकस्लैश replacementको पकड़ना चाहते हैं, तो हमें आवश्यकता होगी (प्रत्येक का प्रतिनिधित्व एक )।"\\\\\\\\"\"\\\\"
तो के साथ संस्करण की replaceAllतरह लग सकता है
replaceAll("\\\\", "\\\\\\\\");
आसान तरीका है
जीवन को आसान बनाने के लिए जावा पाठ targetऔर replacementभागों में स्वचालित रूप से भागने के लिए उपकरण प्रदान करता है । तो अब हम केवल स्ट्रिंग्स पर ध्यान केंद्रित कर सकते हैं, और रेगेक्स सिंटैक्स के बारे में भूल सकते हैं:
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
जो हमारे मामले में दिख सकता है
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
और भी बेहतर
अगर हमें वास्तव में रेगेक्स सिंटैक्स समर्थन की आवश्यकता नहीं है, तो यह बिल्कुल भी शामिल नहीं होने देता है replaceAll। इसके बजाय उपयोग करने देता है replace। दोनों विधियां सभी target s को बदल देंगी , लेकिन replaceरेगेक्स सिंटैक्स को शामिल नहीं करती हैं। तो आप बस लिख सकते हैं
theString = theString.replace("\\", "\\\\");