Regex para corresponder parte da string, quando a correspondência não contém uma string específica - pcre grep
-
25-09-2019 - |
Pergunta
Estou usando o TextWrangler Grep para executar o Find/Substituir em vários arquivos e entrei em uma parede com o último encontro/substituição que preciso executar. Eu preciso corresponder a qualquer texto entre ">
e a primeira instância de um <br />
em uma linha, mas a correspondência não pode conter a sequência do caractere [xcol]. O sabor regex é compatível com o Perl (PCRE), então o LookBehind precisa ser fixo.
Exemplo de texto para pesquisar:
<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>
Comportamento desejado de regex:
1ª linha Combine ">
Foobar<br />
2ª linha Sem correspondência
3ª linha Combine ">
Olá Mundo<br />
4ª linha Sem correspondência
O texto entre ">
e a <br />
será capturado em um grupo a ser usado com a função de substituição. O mais próximo que cheguei foi usar o seguinte regex com aparência negativa, mas isso não corresponderá à 3ª linha conforme desejado:
">((?!.*?\[xcol]).*?)<br />
Qualquer ajuda ou conselho é bem vindo. Obrigada.
Solução
Experimente este regex:
">((?!\[xcol]).)*<br\s*/>
Uma explicação (curta):
"> # 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 />'
Se você precisar combinar quebras de linha para .
Além disso, ative Dot-All (add (?s)
antes de o .
) ou substitua o .
com algo como [\s\S]