سؤال

أنا لا يمكن أن يبدو للعثور على إجابة على هذه المشكلة, و أنا أتساءل عما إذا كان أحد موجودا.المثال المبسط:

النظر في سلسلة "nnnn" ، حيث كنت تريد أن تجد جميع مباريات "nn" - ولكن أيضا تلك التي تتداخل مع بعضها البعض.حتى regex ما يلي 3 مباريات:

  1. nnnn
  2. nnnn
  3. nnnn

أنا أدرك أن هذا ليس بالضبط ما regexes الغرض ، ولكن المشي سلسلة تحليل هذا يدويا تبدو مثل الكثير من التعليمات البرمجية, معتبرا أنه في الواقع المباريات لن يتم إلا باستخدام نمط ، وليس حرفية string.

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

المحلول

ممكن حل يمكن استخدام الإيجابية تبدو وراء:

(?<=n)n

أنها سوف تعطيك نهاية الموقف من:

  1. *n***ن**ن ن
  2. n*n***ن**ن
  3. ن ن*ن***ن**

كما satellite من قبل تيموثي خوري, ، إيجابية lookahead هو أكثر بديهية

وأود أن تفضل أن اقتراحه (?=nn)n أبسط شكل:

(n)(?=(n))

أن مرجع المركز الأول من السلاسل التي تريدها والقبض على الثاني n في المجموعة(2).

ذلك لأن:

  • أي صالحة التعبير العادي يمكن استخدامها داخل lookahead.
  • إذا كان يحتوي على التقاط قوسين ، backreferences سيتم حفظ.

لذا المجموعة(1) والمجموعة(2) التقاط ما 'ن' يمثل (حتى لو كان معقد regex).

نصائح أخرى

باستخدام lookahead مع التقاط مجموعة تعمل على حساب جعل regex أبطأ وأكثر تعقيدا.حل بديل هو إخبار Regex.مباراة (طريقة) حيث المباراة المقبلة محاولة أن تبدأ.جرب هذا:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}

AFAIK لا يوجد نقية regex طريقة للقيام بذلك في وقت واحد (أي.عودة ثلاثة يلتقط لك طلب دون حلقة).

الآن, يمكنك العثور على نمط مرة واحدة حلقة على البحث بدءا من إزاحة (وجدت موقف + 1).ينبغي الجمع بين regex استخدام مع رمز بسيط.

[تحرير] كبيرة, أنا downvoted عندما قال في الأساس ما جان مبين...
[عدل 2] أن تكون واضحة:Jan الجواب هو أفضل.لا أكثر دقة ، ولكن بالتأكيد أكثر تفصيلا ، يستحق أن يكون المختار.أنا فقط لا أفهم لماذا الألغام downvoted ، حيث ما زلت أرى شيئا غير صحيح في ذلك.لا صفقة كبيرة, مجرد مزعج.

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