Regex для сопоставления части строки, когда совпадение не содержит определенную строку - PCRE GREP

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

Вопрос

Я использую 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]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top