Como marcar apenas as primeiras ocorrências de vários resultados de pesquisa?

1

Sou relativamente novo na regex e gostaria muito de receber algumas orientações.
Eu tenho um grande arquivo de texto e gostaria de marcar as linhas das minhas palavras-chave, mas apenas as primeiras instâncias.

Por exemplo:

Maçãs são deliciosas.
Eu gosto de tartarugas.
Ele é alto. Ela é linda. Vá para o inferno!
Tartarugas são espertas.
Estes são os edifícios mais bonitos do mundo. Maçãs são boas para a saúde.
A bandeira húngara é um tricolor horizontal de vermelho, branco e verde.
Tartarugas são répteis.
Você é muito inteligente.
Húngaro é uma língua difícil.
Bananas e maçãs geralmente são baratas.

Se eu fizer um regex (apple | tartaruga | húngaro), eu recebo 8 linhas marcadas, mas no exemplo acima mencionado, Eu só preciso das primeiras ocorrências, então quero marcar apenas as seguintes sentenças:

  • As maçãs são deliciosas.
  • Eu gosto de tartarugas.
  • A bandeira húngara é um tricolor horizontal de vermelho, branco e verde.

Existe uma maneira de fazer isso?

Obrigado antecipadamente.

    
por Viktoria Ontapado 27.04.2017 / 10:22

1 resposta

0

Boa pergunta, tive que aprender alguns truques com o Regex para obter uma resposta :)
Eu não acho que há uma maneira de resolver isso em apenas uma declaração regex para todas as suas palavras ao mesmo tempo. Minha solução é baseada em uma palavra por palavra. Por 100 palavras-chave ... isso ainda pode ser gerenciável.

Então, aqui está

\A^.*?(?<!apple).*?\Kapple

Deixe-me dividir isso ...

Estamos procurando pela primeira ocorrência de maçã

apple

Mas sem a palavra apple na frente, precisamos usar o recurso Negativo Lookbehind

(?<!apple)apple

Mas pode haver outros caracteres e novas linhas no meio, então selecione a opção ". matches newline" e use:

(?<!apple).*?apple

O. * precisa ser não-ganancioso, não sei bem por que ... :)

Novo, devido a esta questão (Eu tive que ir e pedir para descobrir isso;)), precisamos ancorar nosso regex para o começo do arquivo:

\A^(?<!apple).*?apple

\ A é o " início permanente da string ", no notepad ++ corresponde ao início do arquivo.
Nós também temos que adicionar ^, para ancorá-lo na primeira linha do arquivo.

É claro que pode haver caracteres entre o início do arquivo e a primeira ocorrência de apple, então

\A^.*?(?<!apple).*?apple

E, estamos interessados apenas no local da maçã, não no padrão inteiro, por isso usamos \ K para Manter o Texto correspondido até agora fora da correspondência geral de regex

\A^.*?(?<!apple).*?\Kapple
    
por 28.04.2017 / 10:08