regex لمطابقة محتويات العلامة مع حذف المسافة البيضاء الرائدة في وقت واحد

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

سؤال

أحاول كتابة regex يطابق محتويات كاملة من العلامة ، ناقص أي مساحة بيضاء أو زائدة. فيما يلي مثال مغلي للمدخلات:

<tag> نص </tag>

أريد فقط أن يتم مطابقة ما يلي (لاحظ كيف تم تقليم المساحة البيضاء قبل وبعد المباراة):

"نص"

أحاول حاليًا استخدام هذا regex في .NET (PowerShell):

(?<=<tag>(\s)*).*?(?=(\s)*</tag>)

ومع ذلك ، فإن هذا regex يطابق "النص" بالإضافة إلى المسافة البيضاء الرائدة داخل العلامة ، وهو أمر غير مرغوب فيه. كيف يمكنني إصلاح regex للعمل كما هو متوقع؟

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

المحلول

إسقاط lookarounds. إنهم يجعلون المهمة أكثر تعقيدًا مما يجب أن يكون. بدلاً من ذلك ، استخدم مجموعة التقاط لاختيار الجزء الذي تريده:

<tag>\s*(.*?)\s*</tag>

الجزء الذي تريده متاح ك $matches[1].

نصائح أخرى

يجب ألا تستخدم regext لتحليل HTML.

استخدم محلل بدلاً من ذلك.

ايضا:Regex لإزالة سمات علامة الجسم (C#)

كما أيضا: regex تطابق العلامات المفتوحة باستثناء علامات XHTML المستقلة بذاتها

إذا كان كل هذا لا يقنعك ، فلا تستخدم النقطة في منتصف تعبيرك. استخدم الهروب الأبجدي الرقمي. نقطةك تستهلك مساحة بيضاء. استخدم w (على ما أظن) بدلاً من ذلك.

استخدم هذه التعبيرات العادية لتجريد المساحات البيضاء الرائدة. /^\s+/ و /\s+$/

        test = "<tag>     test    </tag>";
        string pattern3 = @"<tag>(.*?)</tag>";
        Console.WriteLine("{0}", Regex.Match(test,pattern3).Groups[1].Value.Trim());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top