java شرح - جافا التعبير العادي OR المشغل



regular expression (2)

قد يكون هذا سؤالًا غبيًا ، لكنني لم أجده في أي مكان:

كيف يمكنني استخدام مشغّل java OR العادي (|) بدون الأقواس؟

على سبيل المثال: هاتف | هاتف | فاكس


Answers

يمكنك فقط استخدام الأنبوب من تلقاء نفسه:

"string1|string2"

فمثلا:

String s = "string1, string2, string3";
System.out.println(s.replaceAll("string1|string2", "blah"));

انتاج:

blah, blah, string3

السبب الرئيسي لاستخدام الأقواس هو الحد من نطاق البدائل:

String s = "string1, string2, string3";
System.out.println(s.replaceAll("string(1|2)", "blah"));

لديه نفس الإخراج. لكن إذا فعلت هذا:

String s = "string1, string2, string3";
System.out.println(s.replaceAll("string1|2", "blah"));

لقد حصلت:

blah, stringblah, string3

لأنك قلت "string1" أو "2".

إذا كنت لا تريد التقاط هذا الجزء من استخدام التعبير ?: ::

String s = "string1, string2, string3";
System.out.println(s.replaceAll("string(?:1|2)", "blah"));

لقد واجهت مؤخرا حالة تسرب الذاكرة تسبب في طريق log4j.

يحتوي Log4j على هذه الآلية تسمى Nested Diagnostic Context (NDC) وهي أداة لتمييز إخراج السجل المشذّر من مصادر مختلفة. الدقة التي يعمل بها المركز هي خيوط ، لذلك فإنه يميز مخرجات السجل من خيوط مختلفة بشكل منفصل.

من أجل تخزين بطاقات تعريف خاصة ، تستخدم فئة NDC من log4j Hashtable والذي تم تأليفه بواسطة كائن مؤشر الترابط نفسه (على عكس قول معرف مؤشر الترابط) ، وهكذا حتى تظل علامة NDC في الذاكرة جميع الكائنات التي تتدلى من مؤشر الترابط كائن أيضا البقاء في الذاكرة. في تطبيق الويب الخاص بنا ، نستخدم NDC لوضع علامة logoutputs مع معرف طلب لتمييز السجلات من طلب واحد بشكل منفصل. تقوم الحاوية التي تربط علامة NDC بمؤشر ترابط أيضًا بإزالتها أثناء إرجاع الاستجابة من طلب ما. حدثت المشكلة عندما حدث أثناء معالجة طلب ، تم إنتاج مؤشر ترابط تابع ، وهو ما يشبه التعليمة البرمجية التالية:

pubclic class RequestProcessor {
    private static final Logger logger = Logger.getLogger(RequestProcessor.class);
    public void doSomething()  {
        ....
        final List<String> hugeList = new ArrayList<String>(10000);
        new Thread() {
           public void run() {
               logger.info("Child thread spawned")
               for(String s:hugeList) {
                   ....
               }
           }
        }.start();
    }
}    

لذلك ارتبط سياق NDC بموضوع مضمّن تم إنشاؤه. الكائن مؤشر الترابط الذي كان المفتاح لسياق NDC هذا هو مؤشر الترابط المضمّن الذي يحتوي على كائن hangList معلقة إيقاف تشغيله. ومن ثم حتى بعد أن انتهى الخيط من القيام بما كان يقوم به ، فإن الإشارة إلى القائمة الضخمة ظلت حية من جانب سياق NDC Hastable ، مما تسبب في حدوث تسرب للذاكرة.





java regex