java - String.replace डबल बैकस्लाश के साथ सभी एकल बैकस्लाश




escaping backslash (4)

आपको पहले तर्क में (बच निकला) बैकस्लैश से बचने की आवश्यकता होगी क्योंकि यह एक नियमित अभिव्यक्ति है। प्रतिस्थापन (दूसरा तर्क - Matcher#replaceAll(String) ) बैकस्लेश का इसका विशेष अर्थ भी है, इसलिए आपको उन्हें इन्हें बदलना होगा:

theString.replaceAll("\\\\", "\\\\\\\\");

मैं String \\something\\ \something\ String \\something\\ को replaceAll करने का प्रयास कर रहा हूं, लेकिन मैं सभी प्रकार की त्रुटियों को प्राप्त करता हूं। मैंने सोचा कि यह समाधान था:

theString.replaceAll("\\", "\\\\");

लेकिन यह नीचे अपवाद देता है:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1

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


String#replaceAll() तर्क को नियमित अभिव्यक्ति के रूप में व्याख्या करता है। \ String और regex दोनों में एक बचने वाला चरित्र है। रेगेक्स के लिए आपको इसे दोबारा से बचाना होगा:

string.replaceAll("\\\\", "\\\\\\\\");

लेकिन आपको इसके लिए रेगेक्स की जरुरत नहीं है, क्योंकि आप एक सटीक चरित्र-दर-चरित्र प्रतिस्थापन चाहते हैं और आपको यहां पैटर्न की आवश्यकता नहीं है। तो String#replace() पर्याप्त होना चाहिए:

string.replace("\\", "\\\\");

अद्यतन : टिप्पणियों के अनुसार, आप जावास्क्रिप्ट संदर्भ में स्ट्रिंग का उपयोग करना चाहते हैं। अधिक संभवतः आप अधिक वर्णों को कवर करने के लिए StringEscapeUtils#escapeEcmaScript() का बेहतर उपयोग StringEscapeUtils#escapeEcmaScript()


replaceAll(target, replacement) लिए नियमित रूप से replaceAll(target, replacement) (आंशिक रूप से replaceAll(target, replacement) लिए नियमित अभिव्यक्ति (regex) वाक्यविन्यास का उपयोग करता है।

समस्या यह है कि \ regex में विशेष वर्ण है (जैसे \d को प्रदर्शित करने के लिए \d ) और स्ट्रिंग शाब्दिक (जैसे \n लाइन विभाजक बनाने के लिए या \" डबल कोट प्रतीक का प्रतिनिधित्व करने के लिए), और \ प्रतीक बनाने के लिए हमें इसे से बचने की आवश्यकता है इन दोनों स्तरों पर इससे पहले अतिरिक्त \

तो target regex बनाने के लिए जो \ प्रतीक का प्रतिनिधित्व करेगा हम इसे दो बार बचने की जरूरत है:

  • regex में \\
  • स्ट्रिंग शाब्दिक "\\\\" (प्रत्येक \ को अपने स्वयं के अतिरिक्त \ पहले की जरूरत है)।

replacement मामले में $ एक अन्य विशेष चरित्र से बचने के लिए भी विशेष है। $x नोटेशन के माध्यम से, regex द्वारा मिलान किए गए डेटा का हिस्सा प्रतिस्थापित किया जा सकता है और प्रतिस्थापन में पुन: उपयोग किया जा सकता है, जैसे replaceAll("(\d)", "$1$1") प्रत्येक अंक को डुप्लिकेट करेगा।

तो फिर, एकल \ replacement हमें दो बैकस्लाश का प्रतिनिधित्व करने वाले पाठ की आवश्यकता है:

  • \\
  • लेकिन स्ट्रिंग शाब्दिक प्रतिनिधित्व \\ जैसा दिखता है "\\\\"

लेकिन चूंकि हम दो \ प्रतिस्थापन को रखना चाहते हैं, हमें वहां "\\\\\\\\" आवश्यकता है (दो "\\\\" )।

replaceAll("\\\\", "\\\\\\\\");

जीवन को आसान बनाने के लिए जावा स्वचालित रूप से target और replacement भागों में टेक्स्ट से बचने के लिए टूल प्रदान करता है। तो अब हम केवल तारों पर ध्यान केंद्रित कर सकते हैं, और रेगेक्स वाक्यविन्यास के बारे में भूल सकते हैं:

replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))

जो हमारे मामले में दिख सकता है

replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))

या यहां तक ​​कि सरल यदि हम रेगेक्स का उपयोग नहीं करना चाहते हैं तो replace करने में शामिल नहीं है और इसके बजाय replace उपयोग करने replace (दोनों विधियां सभी target को प्रतिस्थापित करेंगी, लेकिन दूसरे में रेगेक्स वाक्यविन्यास शामिल नहीं है)। तो आप बस लिख सकते हैं

theString = theString.replace("\\", "\\\\")






replaceall