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

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

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

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

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

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


हां ... जब तक रेगेक्स कंपाइलर आपके द्वारा दिए गए पैटर्न को देखता है, तो यह केवल एक बैकस्लैश देखता है (चूंकि जावा के लेक्सर ने डबल बैकवैक को एक ही में बदल दिया है)। आपको "\\\\" को "\\\\" से प्रतिस्थापित करने की आवश्यकता है, मान "\\\\" या नहीं! जावा वास्तव में एक अच्छा कच्चे स्ट्रिंग वाक्यविन्यास की जरूरत है।


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





replaceall