سؤال

مرحبا ،

الخلفية:

أنا باستخدام Checkstyle 4.4.2 مع RegExp مدقق وحدة الكشف عن اسم الملف في المصدر java رؤوس لا تطابق اسم الملف الفئة أو واجهة التي يقيمون فيها.هذا يمكن أن يحدث عندما مطور نسخة في رأس من فئة واحدة إلى أخرى و لا تعديل "ملف:" الوسم.

التعبير العادي استخدامها في RexExp مدقق تم من خلال العديد من التجسيد و (على الرغم من أنه ربما مبالغة في هذه النقطة) يبدو مثل هذا:

File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)

الشكل الأساسي من الملفات انا التدقيق (على الرغم من تبسيطها إلى حد كبير) يبدو مثل هذا

/*
 *
 *  Copyright 2009
 *  ...
 *  File: Bar.java
 *  ... 
 */
package foo
... 
import ..
...
/**
 * ...
 */
public class Bar
{...} 

المشكلة:

عندما تم العثور على أي تطابق, (أيعند رأس تحتوي على "ملف:Bar.java" نسخ إلى ملف Bat.java ) استلام StackOverflowError على الملفات الطويلة (اختباري الحالة هو @1300 خطوط).

أنا جربت عدة البصرية العادية التعبير اختبار ويمكن أن نرى ذلك في غير مطابقة حالة عندما regex المحرك يمر الخط التي تحتوي على فئة أو واجهة اسم يبدأ البحث مرة أخرى في السطر التالي كما يفعل بعض التراجع الذي ربما يسبب StackOverflowError

السؤال:

كيفية منع StackOverflowError بتعديل التعبير العادي

هل هناك طريقة لتعديل بلدي العادية التعبير هذه التي في غير مطابقة حالة (أيعند رأس تحتوي على "ملف:Bar.java" نسخ إلى ملف Bat.java ) أن المطابقة قد توقف مرة واحدة فإنه يفحص الخط التي تحتوي على واجهة أو اسم الفئة و يرى أن "\1" لا يتطابق مع المجموعة الأولى.

بدلا من ذلك إذا كان هذا يمكن القيام به, هو من الممكن التقليل من عمليات البحث والمطابقة التي تجري بعد ذلك يفحص الخط التي تحتوي على واجهة أو الطبقة وبالتالي التقليل من تجهيز و (أمل) في ستاكوفيرفلوو الخطأ ؟

هل كانت مفيدة؟

المحلول

محاولة

File: (\w+)\.java\n.*^[\w \t]+(?:class|interface) \1

في نقطة-مباريات-كل وضع.الأساس المنطقي:

[\w\s] (في | لا تنتمي هناك) مباريات أي شيء ، بما في ذلك فواصل الأسطر.هذه النتائج في كثير من التراجع إلى الخطوط التي في الجزء السابق من regex كان يقابل.

لو سمحت الجشع نقطة تلتهم كل شيء يصل إلى نهاية الملف (سريع) ثم التراجع حتى تجد الخط الذي يبدأ مع كلمات أو مسافات/علامات التبويب (ولكن لا أسطر) ثم class أو interface و \1 ، ثم التي لا تتطلب الكثير من مساحة مكدس.

مختلفة ، و ربما حتى أفضل حل هو تقسيم المشكلة إلى أجزاء.

المباراة الأولى File: (\w+)\.java جزء.ثم القيام الثاني بحث مع ^[\w \t]+(?:class|interface) بالإضافة إلى \1 المباراة الأولى من البحث على نفس الملف.

نصائح أخرى

متابعة:

أنا الوتر في تيم Pietzcher اقتراح أعلاه و الجشع الحل لم تفشل في الواقع أسرع و دون StackOverflowError عندما لا تطابق وجد.ومع ذلك ، في حالة إيجابية ، StackOverflowError ما زال يحدث.

أخذت نظرة على التعليمات البرمجية المصدر RegexpCheck.java.الطبقات نمط هي التي شيدت في متعدد وضع مثل هذه التعبيرات ^ دولار المباراة بعد أو قبل ، على التوالي ، خط فاصل أو نهاية الإدخال تسلسل.ثم يقرأ كامل ملف فئة في سلسلة و لا العودية البحث عن نمط(انظر findMatch()).هذا هو بلا شك مصدر StackOverflowException.

في النهاية لم أحصل على ذلك العمل (وتخلى) منذ مخضرم 2 صدر مخضرم-checkstyle-المساعد-2.4/Checkstyle 5.0 حوالي 6 أسابيع قررنا ترقية الأدوات.هذا قد لا يحل StackOverflowError المشكلة ولكن سوف تعطيني شيئا آخر للعمل حتى يقرر شخص ما أننا بحاجة إلى مواصلة هذا مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top