Regex para corresponder parte da string, quando a correspondência não contém uma string específica - pcre grep

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

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.

Foi útil?

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]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top