Como posso usar expressões regulares no Excel e aproveitar a poderosa configuração semelhante à grade do Excel para manipulação de dados?
- Função na célula para retornar um padrão correspondente ou um valor substituído em uma sequência.
- Sub para percorrer uma coluna de dados e extrair correspondências para células adjacentes.
- Que configuração é necessária?
- Quais são os caracteres especiais do Excel para expressões regulares?
Eu entendo Regex não é o ideal para muitas situações ( para usar ou não usar expressões regulares? ) Desde excel pode usar Left
, Mid
, Right
, Instr
comandos tipo de manipulações semelhantes.
Like
operador , que fornece uma espécie de versão leve da funcionalidade no estilo regex. Normalmente, é muito mais rápido que o regex, mesmo se envolvido em um procedimento sub ou function.Respostas:
Expressões regulares são usadas para a correspondência de padrões.
Para usar no Excel, siga estas etapas:
Etapa 1 : Adicione referência VBA a "Microsoft VBScript Regular Expressions 5.5"
Etapa 2 : defina seu padrão
Definições básicas:
-
Alcance.a-z
combina letras minúsculas de a a z0-5
corresponde a qualquer número de 0 a 5[]
Combine exatamente um dos objetos dentro desses colchetes.[a]
corresponde à letra a[abc]
corresponde a uma única letra que pode ser a, b ou c[a-z]
corresponde a qualquer letra minúscula do alfabeto.()
Agrupa diferentes correspondências para fins de retorno. Veja exemplos abaixo.{}
Multiplicador para cópias repetidas do padrão definido antes dele.[a]{2}
corresponde a duas letras minúsculas consecutivas a:aa
[a]{1,3}
corresponde a pelo menos um e até três letra minúsculaa
,aa
,aaa
+
Combine pelo menos um, ou mais, do padrão definido antes dele.a+
irá corresponder consecutiva de uma
,aa
,aaa
, e assim por diante?
Corresponder a zero ou um dos padrões definidos antes dele.[a-z]?
corresponde a uma string vazia ou a qualquer letra minúscula.*
Corresponder a zero ou mais do padrão definido antes dele. - Por exemplo, curinga para o padrão que pode ou não estar presente. - Por exemplo,[a-z]*
corresponde a uma sequência vazia ou a uma sequência de letras minúsculas..
Corresponde a qualquer caractere, exceto nova linha\n
a.
corresponde a uma cadeia de dois caracteres começando com a e terminando com qualquer coisa, exceto\n
|
Operador ORa|b
significaa
oub
pode ser correspondido.red|white|orange
corresponde exatamente a uma das cores.^
Operador NOT[^0-9]
caractere não pode conter um número[^aA]
caractere não pode ser minúsculoa
ou maiúsculoA
\
Escapa o caractere especial a seguir (substitui o comportamento acima)\.
,\\
,\(
,\?
,\$
,\^
Padrões de ancoragem:
^
A correspondência deve ocorrer no início da string^a
primeiro caractere deve ser minúsculoa
^[0-9]
primeiro caractere deve ser um número.$
A correspondência deve ocorrer no final da sequênciaa$
último caractere deve ser minúsculoa
Tabela de precedência:
Abreviações de caracteres predefinidas:
Exemplo 1 : Executar como Macro
O exemplo a seguir macro analisa o valor na célula
A1
para ver se os primeiros 1 ou 2 caracteres são dígitos. Nesse caso, eles são removidos e o restante da string é exibido. Caso contrário, será exibida uma caixa informando que nenhuma correspondência foi encontrada. OsA1
valores de célula de12abc
retornarãoabc
, o valor de1abc
retornaráabc
, o valor deabc123
retornará "Não correspondido" porque os dígitos não estavam no início da sequência.Exemplo 2 : Executar como uma função na célula
Este exemplo é o mesmo que o exemplo 1, mas está configurado para ser executado como uma função na célula. Para usar, altere o código para isso:
Coloque suas cordas ("12abc") na célula
A1
. Digite esta fórmula=simpleCellRegex(A1)
na célulaB1
e o resultado será "abc".Exemplo 3 : Loop Through Range
Este exemplo é o mesmo que o exemplo 1, mas percorre um intervalo de células.
Exemplo 4 : Separando Padrões Diferentes
Este exemplo percorre um intervalo (
A1
,A2
&A3
) e procura uma sequência que comece com três dígitos seguidos por um único caractere alfa e depois por quatro dígitos numéricos. A saída separa as correspondências do padrão em células adjacentes usando o()
.$1
representa o primeiro padrão correspondente dentro do primeiro conjunto de()
.Resultados:
Exemplos adicionais de padrões
fonte
Set regEx = Nothing
. Você receberá exceções de falta de memória quando esse Sub for executado com bastante frequência.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Tente mover o código para um separadoModule
.Para usar expressões regulares diretamente nas fórmulas do Excel, a seguinte UDF (função definida pelo usuário) pode ser útil. Expõe mais ou menos diretamente a funcionalidade de expressão regular como uma função do Excel.
Como funciona
Leva 2-3 parâmetros.
$0
,$1
,$2
, e assim por diante.$0
é a correspondência inteira$1
e acima correspondem aos respectivos grupos de correspondência na expressão regular. O padrão é$0
.Alguns exemplos
Extraindo um endereço de email:
Resulta em:
[email protected]
Extraindo várias substrings:
Resulta em:
E-Mail: [email protected], Name: Peter Gordon
Para desmontar uma sequência combinada em uma única célula em seus componentes em várias células:
Resultados em:
Peter Gordon
[email protected]
...Como usar
Para usar esse UDF, faça o seguinte (basicamente com base nesta página da Microsoft . Eles têm boas informações adicionais lá!):
ALT+F11
para abrir o Microsoft Visual Basic for Applications Editor.Clique em Inserir módulo . Se você der um nome diferente ao seu módulo, verifique se o Módulo não tem o mesmo nome que o UDF abaixo (por exemplo, nomear o Módulo
Regex
e a funçãoregex
causa erros de # NOME! ).Na grande janela de texto no meio, insira o seguinte:
Salve e feche a janela do Microsoft Visual Basic for Applications Editor.
fonte
Function foo() As Variant \n foo="Hello World" \n End Function
UDF mínima para ver se isso funciona. Se sim, trabalhe até o ponto acima, se nada básico estiver quebrado (macros desativadas?).Expandindo patszim 's resposta para aqueles com pressa.
adicione o seguinte código:
O padrão regex é colocado em uma das células e a referência absoluta é usada nele. A função será vinculada à pasta de trabalho criada.
Se houver necessidade de ser usada em pastas de trabalho diferentes, armazene a função no Personal.XLSB
fonte
Aqui está a minha tentativa:
fonte
Eu precisava usar isso como uma função de célula (como
SUM
ouVLOOKUP
) e descobri que era fácil:Crie a seguinte função na pasta de trabalho ou em seu próprio módulo:
Em seguida, você pode usar na célula com
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(ex: "A 243" a "A243")fonte
Esta não é uma resposta direta, mas pode fornecer uma alternativa mais eficiente para sua consideração. O Google Sheets possui várias funções Regex integradas, que podem ser muito convenientes e ajudar a contornar alguns dos procedimentos técnicos no Excel. Obviamente, existem algumas vantagens em usar o Excel no seu PC, mas para a grande maioria dos usuários, o Google Sheets oferece uma experiência idêntica e pode oferecer alguns benefícios em portabilidade e compartilhamento de documentos.
Eles oferecem
REGEXEXTRACT: Extrai substrings correspondentes de acordo com uma expressão regular.
REGEXREPLACE: substitui parte de uma sequência de texto por uma sequência de texto diferente usando expressões regulares.
SUBSTITUTE: Substitui o texto existente pelo novo texto em uma sequência.
SUBSTITUIR: Substitui parte de uma sequência de texto por uma sequência de texto diferente.
Você pode digitá-las diretamente em uma célula assim e produzirá o que quiser
Eles também funcionam muito bem em combinações com outras funções, como instruções IF , como:
Esperamos que isso forneça uma solução simples para usuários que se sentem insultados pelo componente VBS do Excel.
fonte
Aqui está uma
regex_subst()
função. Exemplos:Aqui está o código simplificado (mais simples para mim, de qualquer maneira). Não consegui descobrir como criar um padrão de saída adequado usando o acima para funcionar como meus exemplos:
fonte
Não quero habilitar uma biblioteca de referência, pois preciso que meus scripts sejam portáteis. A
Dim foo As New VBScript_RegExp_55.RegExp
linha causouUser Defined Type Not Defined
erros, mas encontrei uma solução que funcionou para mim.O que você deseja fazer é colocar uma sequência de exemplo na célula
A1
e testar suastrPattern
. Quando estiver funcionando, ajuste-orng
conforme desejado.fonte
VBScript_RegExp_55
biblioteca é onipresente e, portanto, apresenta um risco muito baixo de não estar em uma máquina de destino específica. E, de qualquer maneira, alternar do limite inicial para o limite tardio não resolve o problema da portabilidade (o código continuará com erro, apenas no tempo de execução e não no tempo de compilação)Para adicionar ao conteúdo valioso, gostaria de criar este lembrete sobre por que às vezes o RegEx no VBA não é o ideal. Nem todas as expressões são suportadas, mas podem gerar um
Error 5017
e deixar o autor adivinhando (que eu sou uma vítima de mim mesmo).Embora possamos encontrar algumas fontes sobre o que é suportado, seria útil saber quais metacaracteres etc. não são suportados. Uma explicação mais aprofundada pode ser encontrada aqui . Mencionado nesta fonte:
Portanto, não suportados são:
\A
, como alternativa, use o^
cursor para corresponder à posição antes do 1º caracter na string\Z
, use alternativamente o$
cifrão para corresponder à posição após o último caractere na sequência(?<=a)b
(enquanto o LookAhead positivo for suportado)(?<!a)b
(enquanto LookAhead negativo é suportado)\{uFFFF}
/i
(distinção entre maiúsculas e minúsculas) ou/g
(global) etc. Defina-os nasRegExp
propriedades do objeto>RegExp.Global = True
e,RegExp.IgnoreCase = True
se disponíveis.'
comentários regulares no scriptEu já bati em uma parede mais de uma vez usando expressões regulares no VBA. Geralmente com
LookBehind
mas às vezes até esqueço os modificadores. Eu não experimentei todos esses cenários mencionados acima, mas pensei em tentar ser extenso, referindo-me a algumas informações mais aprofundadas. Sinta-se livre para comentar / corrigir / adicionar. Um grande grito para regular-expressions.info por uma riqueza de informações.PS: Você mencionou métodos e funções regulares do VBA, e posso confirmar que eles (pelo menos para mim) foram úteis de suas próprias maneiras em que o RegEx falharia.
fonte