سؤال

لقد حصلت على regex الذي كان على ما يرام، ولكن كما جاء لا يعمل بشكل جيد في بعض المواقف

راقب معاينة الرسالة لأن محرر الرسائل يقوم ببعض الأشياء الصعبة باستخدام "\"

[\[]?[\^%#\$\*@\-;].*?[\^%#\$\*@\-;][\]]

وتتمثل مهمتها في العثور على النمط الذي يبدو بشكل عام هكذا

[أبا]

  • أ - حرف من المجموعة ^،%،#،$،*،@،-،؛
  • ب- بعض النص
  • [ و ] متضمنة في النمط

من المتوقع العثور على كافة تكرارات هذا النمط في سلسلة الاختبار

الثعلب الأسود [#sample1#] [%sample2%] - [#sample3#] يأكل الكتل.

ولكن بدلاً من قائمة التطابقات المتوقعة

  • "[#sample1#]"
  • "[%sample2%]"
  • "[#sample3#]"

لقد فهمت هذا

  • "[#sample1#]"
  • "[%sample2%]"
  • "- [#sample3#]"

ويبدو أن هذه المشكلة ستحدث أيضًا مع الأحرف الأخرى في المجموعة "أ".فهل يمكن لأي شخص أن يقترح تغييرات على التعبير العادي الخاص بي لجعله يعمل كما أحتاج؟

والشيء الأقل أهمية هو كيفية جعل التعبير العادي الخاص بي يستبعد الأنماط التي تبدو هكذا

[اي بي سي]

  • أ - حرف من المجموعة ^،%،#،$،*،@،-،؛
  • ب- بعض النص
  • C - حرف من المجموعة ^،%،#،$،*،@،-،؛ بخلاف أ
  • [ و ] متضمنة في النمط

على سبيل المثال

[$sample1#] [%sample2@] [%sample3;]

شكرا لك مقدما

MTH

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

المحلول

\[([%#$*@;^-]).+?\1\]

مطبق على النص:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

اعواد الكبريت

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • لكن لا [%sample4;]

يحرر

هذا يناسبني (الإخراج كما هو متوقع، تم قبول التعبير العادي بواسطة C# كما هو متوقع):

Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";

MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
  Console.WriteLine(m.Value);
}

نصائح أخرى

لماذا الأول "؟" في [[]؟"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

سوف يكتشف سلاسلك المختلفة على ما يرام

كي تكون اكثر دقة:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

سوف يكتشف [ABA]

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

سوف يكتشف [ABC]

لديك مطابقة اختيارية للقوس المربع الافتتاحي:

[\]]?

بالنسبة للجزء الثاني من سؤالك (وربما للتبسيط) جرب هذا:

\[\%[^\%]+\%\]|\[\#[^\#]+\#\]|\[\$[^\$]+\$\]

في هذه الحالة يوجد نمط فرعي لكل محدد محتمل.و | الشخصية هي "أو" ، لذلك سوف تتطابق مع أي من التعبيرات الفرعية الثلاثة.

كل تعبير فرعي سوف:

  • قوس الافتتاح
  • شار خاص
  • كل ما ليس بحرف خاص (1)
  • حرف خاص
  • إغلاق باكت

(1) قد تحتاج إلى إضافة استثناءات إضافية مثل ']' أو '[' حتى لا تتطابق عن طريق الخطأ مع مجموعة كبيرة من النص مثل:

[%MyVar#] بلا بلا بلا [$OtherVar%]

روب

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