Postagem em destaque

regex - Pegando uma cadeia de caracteres em qualquer posição exceto sozinha.


Capturar uma determina cadeia de caracteres em qualquer posição é um tarefa relativamente simples; onde basicamente podemos utilizar as seguintes expressões:

.*palavra.* ou palavra

Porém, tenho um caso especifico onde preciso capturar uma cadeia de caracteres em qualquer posição, exceto se a mesma estiver sozinha.

Vou explicar;

Eu tenho arquivo de texto com milhares de itens cadastrados, onde há itens comuns e itens com selo ISO9001 que é um selo de qualidade do produto; separei algumas linhas em um arquivo chamado produtos.txt, segue o conteúdo.

produtos.txt

furadeiraISO9001
ISO9001lixadeira
parafusadeira
broca
maquitaISO9001diamantada
ISO9001
capaceteISO900
ISO9001

Você pode observar que os produtos que possuem o selo de qualidade tem a nomenclatura ISO9001 junto com o nome do produto, que podem variar de posição; também há produtos sem e linhas com o selo somente.

O que eu quero é as linhas com os produtos que tenham o selo ISO9001.

Vou utilizar a expressão gulosa '.*texto.*'.

$ cat produtos.txt | egrep '.*ISO9001.*'.

furadeiraISO9001
ISO9001lixadeira
maquitaISO9001diamantada
ISO9001
ISO9001

Dessa forma, o padrão 'ISO9001' casa em todas as posições, porém não faz distinção de linhas que contém ou não o produto.

Para capturar corretamente montei a seguinte regex:

'\w*ISO9001\w+|\w+ISO9001\w*'


Criei dois padrões separados por (|) OU.

1º padrão

Quero qualquer caractere a-zA-Z0-9_ que apareça zero ou mais vezes seguido do selo ISO9001 mais uma cadeia a-zA-Z0-9_ que apareça uma ou mais vezes.

2ª padrão

É o 1ª padrão na ordem reversa, criando todas as combinações de posição.

Vamos testar.


cat produtos.txt | egrep '\w*ISO9001\w+|\w+ISO9001\w*'
furadeiraISO9001
ISO9001lixadeira
maquitaISO9001diamantada

Funcionou !!! Somente as linhas com os produtos com selo de qualidade foram retornadas.


Comentários

Contato

Nome

E-mail *

Mensagem *