Como construir uma localização/substituição de regex no Word 2010

Como construir uma localização/substituição de regex no Word 2010

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:

Recorte VBA

A maior parte do modelo de objeto para este módulo regex pode ser encontrada no MSDNaqui. Uma coisa que parece estar faltando é a MultiLineconfiguração.

Você o usa da seguinte maneira:

  • Instancie um novo objeto regex comDim rx as New RegExp
  • Defina os rx.Globalsinalizadores rx.MultiLine, e rx.IgnoreCaseconforme desejado
  • Defina o padrão atribuindo a sequência de padrão apropriada arx.Pattern
  • Se você quiser saber se algo corresponde à regex, use rx.Test(str), que retorna Trueou Falseapropriadamente
  • A chamada rx.Execute(str)retorna um MatchCollectionobjeto, que se comporta como uma matriz unidimensional e baseada em zero de zero ou mais Matchobjetos
  • Matchobjetos expõem as propriedades FirstIndex, Length, Valuee SubMatches.
    • FirstIndexé o índice baseado em zero do primeiro caractere do local em strque a correspondência foi encontrada
    • Lengthé o comprimento da porção correspondente destr
    • Valueé o resultado da string correspondente
    • SubMatchesé 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 sedoperaçã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:

  1. upload=importar documento Word=txt simples e não formatado para o G'Sheet. Digamos que sua lista estará na coluna A.
  2. 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]+)")))
  3. ...ou faça com que a coluna C separada coloque essa palavra em maiúscula:=UPPER(B:B)
  4. 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

informação relacionada