أولاً ، دعونا نلخص استخدامات الثلاثة:
・ استبدال (الهدف charsequence ، استبدال charquence) ، استبدل جميع الأهداف بالاستبدال ، وكلا المعلمات هي سلاسل.
・ ReplaceAll (سلسلة regex ، استبدال السلسلة) ، استبدل جميع مطابقات regex بالاستبدال. من الواضح أن Regex تعبير منتظم ، والاستبدال هو سلسلة.
・ استبدال FIRST (regex سلسلة ، استبدال السلسلة) ، والذي هو في الأساس مثل replaceall ، والفرق هو أنه يتم استبدال المباراة الأولى فقط.
بعد ذلك ، هناك شرط بسيط ، وهو استبدال سلسلة المصدر بـ /a ، الرمز هو كما يلي:
system.out.println ("abac" .replace ("a" ، "// a")) ؛ //b/acsystem.out.println("abac".replaceall("a "،" // a ") ؛ //abacsystem.out.println("abac".replacefirst("a "،" // a ") ؛ //abacsystem.out.println("abac".replacefirst("a "،" // a ") ؛ // أباكوكانت النتيجة مفاجأة كبيرة. بعد سنوات عديدة من الاستبدال ، كنت مرتبكًا قليلاً.
السلسلة المصدر هي "abac" ، ثم نجد "A" ، استبدلها بـ /a. نظرًا لأن /هي شخصية Java Escape ، إذا كنت ترغب في التعبير عن /A ، فيجب عليك كتابة "// A" ، فإن أولس لاسكشاك يهرب من الذرات التراجع الثانية إلى سلسلة عادية.
مع ثلاثة تعبيرات بديلة ، فإن نتيجة وظيفة الاستبدال الأولى فقط صحيحة. ما هي المشكلة؟
يتطلب ReplaceAll و ReplaceFirst أن المعلمة الأولى هي تعبير منتظم. يمكن فهم "A" على أنها السلسلة A والتعبير العادي A ، وبالتالي فإن المعلمة الأولى جيدة.
تكمن المشكلة في المعلمة الثانية. إذا قرأ القراء بعناية تعليقات وظيفة replaceall ، فسوف يجدون التفسير التالي:
لاحظ أن علامات Backslashes (/) وعلامات الدولار ($) في سلسلة الاستبدال قد تتسبب في أن تكون النتائج مختلفة عما لو كانت تعامل كسلسلة استبدال حرفية ؛ انظر matcher.replaceall. استخدم java.util.regex.matcher.quotereplacement لقمع المعنى الخاص لهذه الشخصيات ، إذا رغبت في ذلك.
نظرًا لأن المعلمة الأولى من ReplaceAll و ReplaceFirst منتظمة ، يمكننا صنع بعض الحيل الصغيرة في المعلمة الثانية ، مثل الشرط: استبدال السلسلة المصدر مع الحرف التالية مباشرة ، فإن الرمز هو كما يلي:
System.out.println ("abac" .replaceall ("a (// w)" ، "$ 1 $ 1")) ؛ //bbccsystem.out.println("abac".replacefirst("a(//w) "،" $ 1 $ 1 ")) ؛ // BBACافترض أن معنى القارئ يمكن أن يفهمه المعنى ، يمكن أن نرى أنه في المعلمة الثانية ، يمكن استخدام رمز $ للحصول على محتوى المجموعة. في هذا المثال ، يتم استخدام $ 1 للحصول على محتوى المجموعة الأولى ، أي الشخصية التي تلي مباشرة.
لذلك ، فإن رمز $ له معنى خاص في المعلمة الثانية ، وكتابته بشكل عشوائي سيؤدي إلى خطأ:
System.out.println ("abac" .replaceall ("a (// w)" ، "$")) ؛ // استثناء في الموضوع "الرئيسي" java.lang.stringIndexOutofBoundSexception: فهرس السلسلة خارج النطاق: 1ماذا لو أردت فقط استبداله بـ $؟ هذا يتطلب الهروب من الشخصيات:
System.out.println ("abac" .replaceall ("a" ، "// $")) ؛ // $ b $ cفي هذه المرحلة ، قد يدرك القراء فجأة أن الذروة الخلفية لها أيضًا معنى خاص (هرب) في المعلمة الثانية ، لذلك إذا أردنا التعبير عن الذروة الخلفية ، فيجب علينا الهروب منه مرة أخرى:
System.out.println ("abac" .replaceall ("a" ، "////") ؛ ///ab/acsystem.out.println("abac".replacefirst("a "،" ///// ") ؛ /// أباكلفهم باختصار ، يهرب الانزلاق الأمامي في "////" وبهذه الطريقة ، فإن السلسلة التي شوهدت في ذاكرة Java هي "// A". عند المعالجة ، تستخدم وظيفة replaceall الانزلاق الخلفي الأمامي للهروب من الانزلاق الخلفي بعد ذلك للتعبير عن أن الذروة الخلفية بعد ذلك هي سلسلة عادية ، لا تستخدم للهروب من $ ، والسلسلة النهائية في الذاكرة هي " /a" ، بحيث يمكن استبدال A /A بنجاح.
لخص
قضية الهروب متشابكة بالفعل. من خلال هذه المقالة ، يأمل المؤلف أن يكون القراء قادرين على البقاء مستيقظين عند استخدام هذه الوظائف في المستقبل ، وأن يكونوا على دراية بالأحرف الخاصة في المعلمات ، وتجنب كتابة قنابل الوقت. ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون ذلك مفيدًا لدراسة الجميع والعمل. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.