AS3 RegExp لمطابقة الكلمات التي تحتوي على أحرف من نوع الحدود

StackOverflow https://stackoverflow.com/questions/790202

سؤال

أريد مطابقة قائمة من الكلمات التي تكون سهلة بدرجة كافية عندما تكون تلك الكلمات كلمات حقيقية.على سبيل المثال /\b (pop|push) \b/gsx عندما ركض ضد السلسلة

دفع بوب الباب لكنه عاد للخلف

سوف يتطابق مع الكلمات pop و Push لكن لا برزت.

أحتاج إلى وظيفة مماثلة للكلمات التي تحتوي على أحرف تعتبر عادةً حدودًا للكلمات.اذا انا احتاج /\b (reverse!|push) \b/gsx عندما ركض ضد السلسلة

ادفع للخلف!عكس! ادفع

لمطابقة العكس فقط!وادفع ولكن لا تتطابق مع الاتجاه المعاكس!ادفع.من الواضح أن هذا التعبير العادي لن يفعل ذلك، فما الذي أحتاج إلى استخدامه بدلاً من \b لجعل التعبير العادي الخاص بي ذكيًا بما يكفي للتعامل مع هذه المتطلبات غير التقليدية؟

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

المحلول

في نهاية الكلمة، \b يعني "الحرف السابق كان حرف كلمة، والحرف التالي (إذا كان هناك حرف تالٍ) ليس حرف كلمة.تريد إسقاط الشرط الأول لأنه قد يكون هناك حرف غير كلمة في نهاية "الكلمة".وهذا يتركك بنظرة مستقبلية سلبية:

/\b (reverse!|push) (?!\w)/gx

أنا متأكد تمامًا من أن regexes AS3 تدعم المظهر المستقبلي.

نصائح أخرى

مشكلتك الأولى هي أنك تحتاج إلى ثلاث (ربما أربع) حالات في تناوبك، وليس اثنتين.

  • /\breverse!(?:\s|$)/ يعكس!بنفسها
  • /\bpush\b/ ادفع من تلقاء نفسها
  • /\breverse!push\b/ معاً
  • /\bpushreverse!(?:\s|$)/ هذه هي الحالة المحتملة

مشكلتك الثانية هي أن أ \b لن تتطابق بعد أ "!" لأنه ليس أ \w.هنا هو ما بيرل 5 يجب أن يقول عنه \b, ، قد ترغب في استشارة مستنداتك لمعرفة ما إذا كانوا يوافقون على ذلك:

حدود الكلمة ("\b") هي نقطة بين حرفين تحتوي على "\w" على أحد جانبيها و"\W" على الجانب الآخر منها (بأي من الترتيبين)، مع حساب الأحرف التخيلية بداية ونهاية السلسلة كمطابقة لـ "\W".(ضمن فئات الأحرف، يمثل "\b" مسافة للخلف بدلاً من حد الكلمة، تمامًا كما يحدث عادةً في أي سلسلة ذات علامات اقتباس مزدوجة.)

لذا، فإن التعبير العادي الذي تحتاجه هو شيء من هذا القبيل

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

لقد تركت /s نظرًا لعدم وجود فترات في هذا التعبير العادي، لذا فإن التعامل مع سطر واحد ليس له أي معنى.لو /s لا يعني معاملته كخط واحد في المحرك الخاص بك، بل ربما يجب عليك إضافته مرة أخرى.يجب عليك أيضًا أن تقرأ عن كيفية تعامل محرك سيارتك مع التناوب.أعلم أنه في Perl 5 للحصول على السلوك الصحيح، يجب عليك ترتيب العناصر بهذه الطريقة (وإلا فالعكس!سيفوز دائمًا بالعكس!الدفع).

يمكنك استبدال \b بشيء مكافئ، ولكن أقل صرامة:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

بهذه الطريقة العامل المحدد لل \b (أنه لا يمكن أن يتطابق إلا قبل أو بعد الحدث الفعلي \w تتم إزالة حرف الكلمة).

الآن تعمل المسافة البيضاء أو بداية/نهاية السلسلة كفواصل صالحة، ويمكن إنشاء التعبير الداخلي بسهولة في وقت التشغيل، من قائمة مصطلحات البحث على سبيل المثال.

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