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