سؤال

أنا أستخدم أغلفة من مشط البايت (http://bytecomb.com/regular-expressions-in-vba/). يبدو أنهم يعملون بشكل جيد للغاية. أحتاج إلى مساعدة في صياغة أنماط قوية.

أواجه نتائج غير متوقعة عند الجمع بين Lookahead "(؟ =)" مع أو "|".

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

"العراق" و "الإقلاع" العمل كما هو متوقع. بالنسبة للمجموعة التالية من سلاسل نص الإدخال ، آمل أن أستخرج "67.89" ، والثالث ، ".89". في البداية ، قمت بصياغة d+.؟ d*|. d+ للرقم العشري العائم لتغطية كلتا الحالتين. إضافة قوسين لم يساعد. إزالة أو ساعد لمدة 67.89. وأخيرا وجدت حل العمل. لكن هل هناك شيء أفضل؟ هل يمكنك مساعدتي في فهم ترتيب الأسبقية؟ إذا كان ذلك ممكنًا ، أود الاحتفاظ بجزرين من أو معًا.

شكرا ، غير برمجة!

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

المحلول

\d+\.?\d*|\.\d+(?=\s*ch) تم تطبيقه على "STA.23.5 .1 الكلمات 67.89 CH" يلتقط 23.5 أولاً لأنه يتطابق \d+\.?\d*

أو "|" له أعلى الأسبقية ، إذا كنت تريد التفكير في الأمر على هذا النحو ، تقسيم النمط إلى تطابقين محتملين: \d+\.?\d* و \.\d+(?=\s*ch)

إذا كنت تريد منع \d+\.?d* من مطابقة 23.5 ، يجب عليك إضافة معايير إضافية ، مثل طلب حرف فضاء قبل ذلك واستخدام أقواس التقاط للحصول على الرقم كخداع فرعي: \s(\d+\.?\d*)

يمكن أن تتطابق مع هذا النمط ، \s(\d+\.?\d*)|\.\d+(?=\s*ch), ، ولكن ضع في اعتبارك أنه إذا كانت النصف الأول مباريات ، فستنظر إلى الفتحات الخفية للقيمة الفعلية.

المشكلة الحقيقية هنا هي أن فئة regexp الخاصة بـ VBScript لا تدعم Lookbehind ، فقط Lookahead.

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