regex لمطابقة جزء من السلسلة ، عندما لا تحتوي المطابقة على سلسلة محددة - pcre grep

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

سؤال

أنا أستخدم TextWrangler GREP لإجراء Find/Relip على ملفات متعددة وركضت في جدار مع آخر اكتشاف/استبدال أحتاج إلى القيام به. أحتاج إلى مطابقة أي نص بين "> والمثال الأول من أ <br /> في خط ولكن لا يمكن أن تحتوي المباراة على تسلسل الأحرف [XCOL]. نكهة Regex متوافقة مع Perl (PCRE) لذلك يجب أن يكون Lookbehind ثابتًا.

مثال على النص للبحث:

<p class="x03">FooBar<br />Bar</p>
<p class="x03">FooBar [xcol]<br />Bar</p>
<p class="x06">Hello World<br />[xcol]foo[xcol]bar<br /></p>
<p class="x07">Hello World[xcol]<br />[xcol]foo[xcol]bar<br /></p>  

السلوك المطلوب من Regex:
الخط الأول تطابق ">Foobar<br />
الخط الثاني لا تطابق
الخط الثالث تطابق ">مرحبا بالعالم<br />
الخط الرابع لا تطابق

النص بين "> و ال <br /> سيتم التقاطها في مجموعة لاستخدامها مع وظيفة استبدال. كان الأقرب الذي حصلت عليه هو استخدام Regex التالي مع Lookahead السلبي ، ولكن هذا لن يتطابق مع السطر الثالث كما هو مطلوب:

">((?!.*?\[xcol]).*?)<br />

ويقدر أي مساعدة أو مشورة. شكرًا لك.

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

المحلول

جرب هذا regex:

">((?!\[xcol]).)*<br\s*/>

شرح (قصير):

">               # match '">'
(                # start group 1
  (?!\[xcol]).   #   if '[xcol]' can't be seen ahead, match any character (except line breaks)
)                # end group 1
*                # repeat group 1 zero or more times
<br\s*/>         # match '<br />'

إذا كنت بحاجة إلى مطابقة استراحات الخط . كذلك ، إما تمكين DOT-All (ADD (?s) قبل .) أو استبدال . مع شيء مثل [\s\S]

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