Eu tenho uma lista exportada de outro aplicativo. Os resultados são retornados com caracteres extras entre eles.
O que eu ganho:
Mary One;#123;#Bob Two;#2345;#Charles Three;#445
O que eu quero:
Mary One; Bob Two; Charles Three
O número de usuários que podem estar listados na célula não é consistente. O outro fator complicador é que os números variam entre 3 e 4 caracteres.
Estou tentando impedir que isso fique muito complicado. Idealmente, essa seria uma fórmula que eu comunicaria ao resto do meu departamento para usar conforme necessário.
Vou usar SUBSTITUTE e LEN, mas eu poderia usar alguma ajuda para manter isso limpo.
Respostas:
Vou apresentar aqui algumas opções para escolher, mas todas elas se baseiam em expressões regulares. É possível não usar regex, mas acho que isso pode envolver um pouco mais de tempo.
[Opção 1 - https://regex101.com/]
Visite a página https://regex101.com/
Defina o sabor como 'pcre (php)' - é a opção padrão
Expressão regular:
(?<=;)(#\d+;#)|(;#\d+$)
Sinalizador:g
Cadeia de caracteres de teste:
Mary One;#123;#Bob Two;#2345;#Charles Three;#445
Substituição:
// um espaço (ou pode ser deixado em branco)
Saída:
Mary One; Bob Two; Charles Three
A saída precisa ser cortada, pois há um espaço adicional no final.
[Opção 2 - LibreOffice Calc (portátil)]
A janela 'Localizar e substituir' do Calc permite o uso de expressões regulares.
Ctrl + H
Localizar:
(?<=;)(#\d+;#)|(;#\d+$)
Substitua por: um espaço ou em branco
Na seção 'Outras opções', marque 'Expressões regulares'
Clique no botão 'Substituir tudo'.
[Opção 3 - Bloco de notas ++]
Estou mencionando N ++ aqui, pois é uma ferramenta realmente poderosa ao trabalhar com muitos tipos de textos. Seu poder está amplamente em vários plugins. Mas aqui vou me referir a uma janela Substituir padrão. O Regex permite dividir as partes correspondentes do texto. Isso é chamado de agrupamento. Cada grupo pode ter um nome e esse nome pode ser usado na substituição.
Ctrl + H → aba Substituir
Agrupar: marcado
Modo de pesquisa: Expressão regular
Encontre o que:
(?'name_surname'[^;#]+\s[^;#]+;)(#\d+(;#|$))
Substitua por:
$+{name_surname}
Clique no botão 'Substituir tudo'
Significado:
'Encontre o que' encontra tudo - o texto desejado e indesejado.
'Substituir por' substitui o texto bruto apenas pelas partes desejadas.
[Opção 4 - Excel - função definida pelo usuário (VBA)]
Abra o editor do Visual Basic (Alt + F11)
Adicionar referência:
Ferramentas -> Referências -> Expressões regulares do Microsoft VBScript 5.5
[Resumo]
Tentei me concentrar em soluções bastante rápidas, mas totalmente funcionais, então acho que o sth pode ser extraído dela.
fonte
Expr = "(#\d+;#?)|(;#\d+$)"
. A nova expressão ainda funciona com as seqüências anteriores. Se você encontrou alguns cenários mais negativos, provavelmente a causa raiz está no regex, mas felizmente isso pode ser facilmente alterado.Eu tentei a fórmula. Não foi bonito. No entanto, tenho certeza de que existem outras maneiras de fazer isso.
Esta fórmula pegará sua seqüência na célula A1 e removerá as seqüências
#123
e#2345
. Você sempre pode expandir ainda mais a técnica, se desejar. Ele encontra as ocorrências de "#" e depois divide a cadeia em pedaços menores.Não é limpo nem facilmente transmissível.
Sugiro uma função definida pelo usuário. Aqui está um artigo explicando como configurar e distribuir uma função de usuário. Experimente a UDF e, se tiver alguma dúvida sobre o processo, pergunte.
fonte