regex لمطابقة جزء من السلسلة ، عندما لا تحتوي المطابقة على سلسلة محددة - pcre grep
-
25-09-2019 - |
سؤال
أنا أستخدم 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]