টিএলডিআর: theString = theString.replace("\\", "\\\\");
পরিবর্তে ব্যবহার করুন।
সমস্যা
replaceAll(target, replacement)
এর জন্য target
এবং আংশিকভাবে নিয়মিত এক্সপ্রেশন (রেজেক্স) সিনট্যাক্স ব্যবহার করে replacement
।
সমস্যাটি হ'ল \
রেগেক্সে এটি বিশেষ চরিত্র (এটি অঙ্কটি \d
উপস্থাপনের মতো ব্যবহার করা যেতে পারে ) এবং স্ট্রিং আক্ষরিক ক্ষেত্রে (এটি "\n"
লাইন বিভাজককে উপস্থাপন \"
করতে বা ডাবল উদ্ধৃতি চিহ্ন থেকে বেরিয়ে আসার জন্য ব্যবহার করা যেতে পারে যা সাধারণত স্ট্রিং লিটারেলের শেষের প্রতিনিধিত্ব করে)।
এই উভয় ক্ষেত্রেই তৈরি করার জন্য \
প্রতীক আমরা করতে অব্যাহতি এটা (এটিকে পরিবর্তে বিশেষ অক্ষর আভিধানিক) অতিরিক্ত স্থাপন দ্বারা \
এটা আগে (যেমন আমরা অব্যাহতি "
মাধ্যমে স্ট্রিং লিটারেল মধ্যে \"
)।
সুতরাং target
প্রতিনিধিত্বকারী \
প্রতীককে রেজেক্সের জন্য ধারণ করতে হবে \\
, এবং এই জাতীয় পাঠ্যের প্রতিনিধিত্বকারী স্ট্রিংয়ের মতো দেখতে হবে "\\\\"
।
সুতরাং আমরা \
দুবার পালিয়েছি :
- একবার রেগেক্সে
\\
- স্ট্রিং আক্ষরিক একবারে
"\\\\"
(প্রতিটি \
হিসাবে প্রদর্শিত হয় "\\"
)।
ক্ষেত্রে replacement
\
এছাড়াও বিশেষ। এটি আমাদের অন্যান্য বিশেষ চরিত্র থেকে বাঁচতে দেয় $
যা চিহ্নিতকরণের মাধ্যমে $x
, রেগেক্সের সাথে মিলে যাওয়া এবং ক্যাপচারিত গোষ্ঠী অনুসারে ডেটা অংশ ব্যবহার করার অনুমতি দেয় 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
গুলি কিন্তু replace
Regex সিনট্যাক্স সঙ্গে যুক্ত নয়। সুতরাং আপনি সহজভাবে লিখতে পারে
theString = theString.replace("\\", "\\\\");