Regex для сопоставления части строки, когда совпадение не содержит определенную строку - PCRE GREP
-
25-09-2019 - |
Вопрос
Я использую TextWrangler GREP, чтобы выполнить поиск / заменить на несколько файлов и запустить в стену с последней находкой / заменой, который мне нужно выполнить. Мне нужно сопоставить любой текст между ">
и первый случай <br />
в линии, но матч не может содержать последовательность символов [XCOL]. Аромат Regex - совместимый PERL (PCRE), поэтому Lookinghind должен быть фиксированной длиной.
Пример текста для поиска:
<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:
1-я строка соответствовать ">
Foobar.<br />
2-я строка не совпадает
3-я строка соответствовать ">
Привет мир<br />
4-я линия не совпадает
Текст между ">
и то <br />
будет захвачен в группе, которая будет использоваться с функцией замены. Самое близкое, которое я получил, использовал следующее регулярное выражение с негативным lookahead, но это не будет соответствовать 3-й строке по желанию:
">((?!.*?\[xcol]).*?)<br />
Любая помощь или совет ценится. Спасибо.
Решение
Попробуйте это регулярное выражение:
">((?!\[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-все (добавить (?s)
перед .
) или замените .
с чем-то вроде [\s\S]