java - जावा में String.replaceAll() क्यों वास्तव में "\" को प्रतिस्थापित करने के लिए regex में 4 स्लेश "\\\\" की आवश्यकता है?




escaping charsequence (4)

आपको दो बार, जावा के लिए एक बार, एक बार regex के लिए esacpe की जरूरत है।

जावा कोड है

"\\\\"

के एक regex स्ट्रिंग बनाता है

"\\" - two chars

लेकिन regex एक भागने की जरूरत है तो यह में बदल जाता है

\ - one symbol

मैंने हाल ही में देखा है कि स्ट्रिंग.रेले प्लेस (regex, replacement) बहुत अजीब व्यवहार करता है जब यह एस्केप-वर्ण "\" (स्लैश)

उदाहरण के लिए मान लें कि String text = "E:\\dummypath" - String text = "E:\\dummypath" साथ एक स्ट्रिंग है और हम "/" को "/" से बदलना चाहते हैं।

text.replace("\\","/") आउटपुट "E:/dummypath" जबकि text.replaceAll("\\","/") अपवाद java.util.regex.PatternSyntaxException उठाता है।

यदि हम replaceAll() साथ एक ही कार्यक्षमता को लागू करना चाहते हैं, तो हमें इसे text.replaceAll("\\\\","/") लिखना होगा।

एक उल्लेखनीय अंतर replaceAll() में अपनी आर्गुमेंट्स को रेग-एफ़ होता है जबकि replace() में वर्ण-क्रम अनुक्रम होता है!

लेकिन text.replaceAll("\n","/") अपने चार-अनुक्रम के समकक्ष text.replace("\n","/") के समान ही कार्य करता है। text.replace("\n","/")

गहरा खुदाई: जब हम कुछ अन्य इनपुट की कोशिश करते हैं तब भी और भी अजीब व्यवहार देखा जा सकता है।

text="Hello\nWorld\n" निर्दिष्ट text="Hello\nWorld\n"

अब, text.replaceAll("\n","/") , text.replaceAll("\\n","/") , text.replaceAll("\\\n","/") इन तीनों को देता है एक ही आउटपुट Hello/World/

जावा वास्तव में सबसे अच्छा संभव तरह से मुझे लगता है कि reg-ex के साथ गड़बड़ कर दी थी! किसी भी अन्य भाषा में रेग-एक्स में ये चंचल व्यवहार नहीं होता है कोई विशिष्ट कारण, क्यों जावा इस तरह गड़बड़?


इसका कारण यह है कि जावा प्रतिस्थापन स्ट्रिंग में एक विशेष अर्थ देने की कोशिश करता है, ताकि \ $ एक शाब्दिक $ संकेत हो, लेकिन इस प्रक्रिया में वे वास्तव में \

जबकि text.replaceAll("\\\\","/") , कम से कम कुछ अर्थों में ठीक समझा जा सकता है (हालांकि यह बिल्कुल बिल्कुल सही नहीं है), सभी तीन फांसी, text.replaceAll("\n","/") , text.replaceAll("\\n","/") , text.replaceAll("\\\n","/") उसी आउटपुट को और भी अधिक अजीब लग रहा है यह सिर्फ इसी तरह के विरोधाभासी है कि उन्होंने इसी कारण के लिए text.replaceAll("\\","/") के कामकाज को प्रतिबंधित कर दिया है। text.replaceAll("\\","/")

जावा नियमित अभिव्यक्ति के साथ गड़बड़ नहीं था इसका कारण यह है कि, जावा को अद्वितीय और अलग-अलग करने की कोशिश करते हुए कोडर के साथ गड़बड़ करना पसंद करता है, जब यह आवश्यक नहीं होता है


मुझे लगता है कि जावा वास्तव में String.replaceAll () में नियमित अभिव्यक्ति के साथ खराब है;

जावा के अलावा मैंने कभी भी एक भाषा को इस तरह नियमित अभिव्यक्ति नहीं देखा है। यदि आप कुछ अन्य भाषाओं में रेगेक्स का इस्तेमाल करते हैं तो आप भ्रमित होंगे।

प्रतिस्थापन स्ट्रिंग में "\\" का उपयोग करने के मामले में, आप java.util.regex.Matcher.quoteReplacement(String) उपयोग कर सकते हैं।

String.replaceAll("/", Matcher.quoteReplacement("\\"));

इस Matcher वर्ग का उपयोग करके आप अपेक्षित परिणाम प्राप्त कर सकते हैं।


ये 4 बैकस्लैश समझा जाने का एक अन्य तरीका

1) मान लीजिए कि आप जावा की जगह की जगह एक एकल \

\
˪--- 1) the final backslash

2) जावा की जगह सभी विधि एक तर्क के रूप में पहली तर्क लेता है। एक regex में शाब्दिक , \ एक विशेष अर्थ है, जैसे \d जो [0-9] (किसी भी अंक) के लिए एक शॉर्टकट है। एक रीगाक्स शाब्दिक में एक मेटाकार से बचने का तरीका यह है कि वह \

\\
|˪--- 1) the final backslash
˪---- 2) the backslash needed to escape 1) in a regex literal

3) जावा में, कोई रीजएक्स नहीं है: आप एक स्ट्रैग में एक रीजक्स लिखते हैं (उदाहरण के लिए जावास्क्रिप्ट के विपरीत, जहां आप लिख सकते हैं /\d+/ ) लेकिन एक स्ट्रिंग में , \ \n एक विशेष अर्थ है, जैसे \n (एक नई पंक्ति) या \t (एक टैब)। एक स्ट्रिंग में एक मेटाचल से बचने का तरीका यह है कि यह एक से पहले होता है, जिसके कारण होता है:

\\\\
|||˪--- 1) the final backslash
||˪---- 3) the backslash needed to escape 1) in a string literal
|˪----- 2) the backslash needed to escape 1) in a regex literal
˪------ 3) the backslash needed to escape 2) in a string literal




charsequence