regex لمطابقة محتويات العلامة مع حذف المسافة البيضاء الرائدة في وقت واحد
-
26-09-2019 - |
سؤال
أحاول كتابة 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());