Регулярное выражение для совпадения с частью строки, если соответствие не содержит конкретной строки - PCRE grep - PullRequest
3 голосов
/ 05 января 2011

Я использую TextWrangler grep, чтобы выполнить поиск / замену нескольких файлов и натолкнулся на стену с последним поиском / заменой, который мне нужно выполнить.Мне нужно сопоставить любой текст между "> и первым экземпляром <br /> в строке, но совпадение не может содержать последовательность символов [xcol].Вариант regex совместим с Perl (PCRE), поэтому внешний вид должен быть фиксированной длины.

Пример текста для поиска:

<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>  

Желательное поведение регулярного выражения:
1-я строка match "> FooBar <br />
2-я строка не соответствует
3-я строка соответствует "> Hello World <br />
4-я строка не соответствует

Текст между "> и <br /> будут захвачены в группе, которая будет использоваться с функцией замены.Самым близким, что я получил, было использование следующего регулярного выражения с отрицательным прогнозом, но это не будет соответствовать 3-й строке, как требуется:

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

Любая помощь или совет приветствуются.Спасибо.

1 Ответ

3 голосов
/ 05 января 2011

Попробуйте это регулярное выражение:

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

A (короткое) объяснение:

">               # 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 (добавьте (?s) перед .), либо замените . чем-то вроде [\s\S]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...