سؤال

أنا أعمل على Preprocessor الذي يحلل DSL. هدفي هو إزالة التعليقات. يتم ترسيم مرفق كتلة التعليق بواسطة %% قبل وبعد. لا داعي للقلق حوالي ٪٪ في سلاسل، من خلال تعريف اللغة.

أنا أستخدم هذا s/// regex. لسوء الحظ، يبدو أن تطابق كل شيء وقم بمسحها:

#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;

ما الخطأ الذي افعله؟

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

المحلول

أول شيء يمكنك القيام به هو جعله غير جشع:

.*?

غير ذلك،

٪٪ بعض النصوص ٪٪

المحتوى الحقيقي

٪٪ نص آخر ٪٪

سيتم مسح جميعها.

نصائح أخرى

من Perlfaq6: ماذا يعني أن Regexes جشع؟ كيف يمكنني الحصول على حولها؟


يعني معظم الناس أن Regexes الجشع تطابق قدر الإمكان. من الناحية الفنية، إنها في الواقع الكميات (؟، *، +، {}) الجشع بدلا من النمط بأكمله؛ بيرل تفضل الجشع المحلي والإرضاء الفوري للجشع العام. للحصول على إصدارات غير جشعة من نفس الكميات، استخدم (؟، *، +؟، {}؟).

مثال:

$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //;      # I am cold
$s2 =~ s/ve.*?y //;     # I am very cold

لاحظ كيف توقف الاستبدال الثاني عن مطابقة بمجرد مواجهته "Y". ال *؟ يحكي الكم بشكل فعال محرك التعبير العادي للعثور على تطابق في أسرع وقت ممكن وممارسة التحكم في كل ما هو التالي في السطر، كما لو كنت تلعب البطاطا الساخنة.

على افتراض أنك قرأت الكود بالكامل في المتغير $ Str وبين ٪٪ و ٪٪ لا يوجد أي إمكانية يحدث في٪ واحد، يمكنك استخدام هذا.

$ str = ~ s / ٪٪ ([^٪] +) ٪٪ // g؛

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