Parsing de string de várias linhas para extrair apenas linhas combinadas

2

Eu tenho uma string de várias linhas e gostaria de extrair apenas linhas que correspondam a um determinado padrão e descartar o restante da string.

string original:

lorem ipsum dolor sit amet consectetur
nunc KEEP THIS LINE ut massa lorem
DO NOT KEEP THIS LINE aenean blandit
nunc KEEP THIS LINE et justo quis
praesent at velit felis vel

Sequência final desejada:

KEEP THIS LINE ut massa lorem
KEEP THIS LINE et justo quis

O regex que tenho até agora é:

(?ms).*?(?-s)^nunc (KEEP THIS LINE.*?$)

Posso apenas substituir a correspondência pela referência anterior . No entanto, isso não substitui o final do último padrão correspondente ao final da string.

O regex:

(?ms).*?(?-s)(^nunc (KEEP THIS LINE.*?$)|(?s:).*?\Z)

identifica com êxito o padrão entre a última linha desejada e o final da string, mas não consigo descobrir como removê-la.

    
por smaxey 05.02.2013 / 20:47

1 resposta

0

A substituição de ^(?:nunc (KEEP THIS LINE.*)|.*\n)$ por atingirá a saída desejada:

  • Devido ao alternador ( | ), a expressão ^(?:nunc (KEEP THIS LINE.*)?|.*\n)$ forçará a correspondência da linha inteira, sem capturá-la ( ?: designa um grupo sem captura).

  • Se a linha começar com nunc KEEP THIS LINE , se referirá ao interior dos parênteses, isto é, a string começando com KEEP THIS LINE e terminando no final da linha.

  • Se a linha não começar com nunc KEEP THIS LINE , .*\n corresponderá à linha inteira, incluindo o caractere de nova linha de término.

A expressão regular acima funciona bem com o Perl.

No Notepad ++ com quebras de linha do Windows, você pode usá-lo:

^(?:nunc (KEEP THIS LINE.*)|.*(\r\n)?)

Observe que isso só removerá a última linha e não a removerá.

    
por 05.02.2013 / 21:45