Tenho alguma experiência limitada com regex javascript básico, que usei para manipular algumas entradas de dados do usuário. Mas agora fui questionado sobre a manipulação de documentos do MS Word 2010.
Especificamente, meus usuários obtêm uma longa lista numérica de dados como:
1. blah blah 'car' blah blah
2. blah blah 'truck' blah blah
3. blah blah 'boat' blah blah
Isso está em um documento Word simples e não formatado. Eles gostariam de um cabeçalho formatado após cada numeral, com base no item entre aspas simples, ala:
1. CAR: blah blah 'car' blah blah
2. TRUCK: blah blah 'truck' blah blah
3. BOAT: blah blah 'boat' blah blah
atualmente eles têm transcritores que fazem essas alterações manualmente (às vezes com erros). Com javascript/jQuery, eu poderia escrever algum código para pegar esses dados, procurar palavras entre aspas, encontrar o número mais próximo antes da correspondência e inserir uma versão totalmente em CAPS após o ponto final.
Porém, não tenho muita experiência com funções semelhantes no Word. Isso pode ser feito através de uma macro ou algum tipo de script? É possível escrever meu código javascript/jQuery e executá-lo em uma instância do Word de alguma forma?
Obrigado pela orientação!
Responder1
Sim! O Microsoft Office VBA oferece suporte nativo à pesquisa de expressões regulares. Você deve adicionar "Microsoft VBScript Regular Expressions 5.5" como referência no Editor VBA para cada arquivo .docm
, .xlsm
, etc. no qual deseja colocar o código Regex:
A maior parte do modelo de objeto para este módulo regex pode ser encontrada no MSDNaqui. Uma coisa que parece estar faltando é a MultiLine
configuração.
Você o usa da seguinte maneira:
- Instancie um novo objeto regex com
Dim rx as New RegExp
- Defina os
rx.Global
sinalizadoresrx.MultiLine
, erx.IgnoreCase
conforme desejado - Defina o padrão atribuindo a sequência de padrão apropriada a
rx.Pattern
- Se você quiser saber se algo corresponde à regex, use
rx.Test(str)
, que retornaTrue
ouFalse
apropriadamente - A chamada
rx.Execute(str)
retorna umMatchCollection
objeto, que se comporta como uma matriz unidimensional e baseada em zero de zero ou maisMatch
objetos Match
objetos expõem as propriedadesFirstIndex
,Length
,Value
eSubMatches
.FirstIndex
é o índice baseado em zero do primeiro caractere do local emstr
que a correspondência foi encontradaLength
é o comprimento da porção correspondente destr
Value
é o resultado da string correspondenteSubMatches
é uma matriz baseada em zero dogrupos subcorrespondidosdentro da partida geral- Infelizmente, o regex do Office VBA não oferece suporte a grupos nomeados como, por exemplo, Python, portanto, pode ser necessária alguma tentativa e erro para combinar o índice do grupo com a parte do padrão no qual você está interessado
Não acredito que exista uma maneira de realizar uma sed
operação de substituição no local - é uma funcionalidade somente de pesquisa. Porém, é fácil usar o VBA circundante para manipular os resultados como desejar.
Responder2
Se for apenas texto simples no documento do Word e não for muito grande e você estiver familiarizado com jquery, você pode criar um site simples onde eles possam copiar/colar o documento do Word e fazer as alterações necessárias e deixá-los baixar a palavra transformada documento ou produza o texto desejado. Realmente depende de mais detalhes da sua situação para dizer se esta é uma boa solução.
A macro provavelmente também poderia ser executada, mas poderia ser difícil de implantar para os usuários, dependendo de quantos usuários você tivesse.
Responder3
Caso você não tenha experiência em scripts VBA ou Python e a ideia de resposta @ hBy2Py não se adapte à sua competência, tente uma solução alternativa com o GoogleSheets/Excel implementando seu algoritmo:
- upload=importar documento Word=txt simples e não formatado para o G'Sheet. Digamos que sua lista estará na coluna A.
- na coluna B escreva a fórmula aninhada para todas as colunas usando REGEXEXTRACT para a palavra entre aspas e colocando essa palavra em maiúscula
=ARRAYFORMULA(UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)")))
- ...ou faça com que a coluna C separada coloque essa palavra em maiúscula:
=UPPER(B:B)
- na coluna C (ou D) combine a nova lista com a palavra CAPS (há várias maneiras de fazer isso, por exemplo, dividindo/concatenando ou apenas
=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&B:B&": "))
TLDR:
=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)"))&": "))
Outra solução alternativa poderia ser usar a solução descrita aqui:Encontre e substitua no Notepad ++ usando curingas/regex