regex - example - regular expression شرح




كيف يمكنني جعل مباراتي غير الجشع في فيم؟ (6)

لدي ملف HTML كبير يحتوي على الكثير من العلامات التي تبدو كالتالي:

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

أحاول إجراء بحث واستبدال Vim للتخلص من كل class="" و style="" ولكن أواجه مشكلة في جعل المباراة غير مضمونة.

كانت محاولتي الأولى هذا

%s/style=".*?"//g

ولكن لا يبدو فيم مثل ? . لسوء الحظ إزالة ? يجعل المباراة جشعة جدا.

كيف يمكنني جعل مباراتي غير مشروعة؟


G'day،

معالجة regexp Vim ليست رائعة جدا. لقد وجدت أن بناء الجملة regexp للسيد هو حول المباراة الصحيحة لقدرات vim.

عادةً ما أقوم بتحديد تمييز البحث على (: set hlsearch) ثم نلعب مع regexp بعد إدخال شرطة مائلة لإدخال وضع البحث.

تحرير: مارك ، وتغطي أيضا تلك الحيلة للحد من المطابقة الجشع في كتاب دايل Dougherty الممتاز "سيد وعوك" ( رابط الأمازون المطهرة ).

الفصل الثالث "فهم صيغة التعبير المنتظم" هو مقدمة ممتازة لقدرات regexp البدائية الأكثر علاقة بـ sed و awk. فقط قراءة قصيرة والموصى بها للغاية.

HTH

في صحتك،


إذا كنت أكثر راحة بناء جملة regex PCRE ، والتي

  1. يدعم المشغل غير الجشع ، كما طلبت في OP ؛ و
  2. لا تحتاج إلى مشغلات تجميع و backinhacking backwhacking (شرط لنمط vim مضلل تمامًا نظرًا لأنك لا تتطابق مع الأحرف الحرفية بل تحدد المشغلين) ؛ و
  3. لديك [g] vim جمعت مع ميزة بيرل ، اختبار باستخدام

    : الإصدار وفحص الميزات ؛ إذا كان + بيرل هناك ، فأنت على ما يرام)

حاول البحث / استبدال باستخدام

:perldo s///

مثال. Swap src and alt attributes in img tag:

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

بدلاً من .* الاستخدام .\{-} .

%s/style=".\{-}"//g

أيضا ، انظر :help non-greedy


لقد وجدت أن الحل الجيد لهذا النوع من الأسئلة هو:

:%!sed ...

(أو perl إذا كنت تفضل). IOW ، بدلاً من تعلم خصائص vim's regex ، استخدم أداة تعرفها بالفعل. باستخدام بيرل من شأنه أن يجعل؟ تعديل يعمل على غير قوام المباراة.


مع \v (كما هو مقترح في عدة تعليقات)

:%s/\v(style|class)\=".{-}"//g

يتم البحث غير الجشع في vim باستخدام {-} المشغل. مثله:

%s/style=".\{-}"//g

حاول فقط:

:help non-greedy




regex-greedy