Pesquisa curinga do Word 2010 - Encontre texto no formato ABC.DEF.XYZ

Pesquisa curinga do Word 2010 - Encontre texto no formato ABC.DEF.XYZ

Estou tentando encontrar texto no Word 2010 no seguinte formato: ABC.DEF.XYZ. Isto é essencialmente encontrar referências de código, usando a sintaxe Java, escritas no documento do Word. Observe que uma referência de 3 elementos é apenas um exemplo. As referências reais possuem no mínimo 2 elementos e no máximo 5 elementos.

Tentei várias combinações de caracteres curinga (e não curinga) para fazer isso funcionar, mas não tive sorte. Aqui estão algumas das coisas que tentei:

  1. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    NOTA, isso realmente funciona para encontrar uma referência de 2 elementos. Foi um acerto ou erro ao encontrar o padrão dentro de uma string maior (por exemplo, combinar os elementos 2 e 3 de uma referência de 3 elementos)

  2. <([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
    Dá um erro - padrão inválido

  3. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    Demora tanto para ser executado que o Word travou por mais de 15 minutos e não encontrou uma única correspondência (o documento tem cerca de 150 páginas de texto, então talvez fosse demais para ele lidar)

  4. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    O Word realmente travou quando tentei este.

Idealmente, acho que uma versão funcional do nº 2 seria ideal - no entanto, não sei como tornar o padrão válido.

Se isso não for possível, eu poderia simplesmente usar #1 e esperar que ele capture tudo (não sei por que corresponde a certas strings e não a outras).

Qualquer ajuda é muito apreciada.

Responder1

Você pode usar o mecanismo VBA RegEx do Word em vez da pesquisa curinga do Word.


Ok, a tarefa era encontrar todas as strings com o seguinte padrão

###.###  
###.###.###
###.###.###.###
###.###.###.###.###

O melhor padrão que pude criar foi

([\w\d]{3}\.){1,4}[\w\d]{3}

que retorna os seguintes hits marcados em amarelo

insira a descrição da imagem aqui

Explicação do padrão

  • \wcorresponde a um único caractere de Az. Não faz distinção entre maiúsculas e minúsculas
  • \dcorresponde a um dígito 0-9
  • [\w\d]{3}corresponde a 3 caracteres ou dígitos como ABC, abc, 123, Ab1- mas não A$CouABCD
  • ([\w\d]{3}\.){1,4}corresponde a 1,2,3 ou 4 grupos com um ponto seguinte \.. O último grupo [\w\d]{3}não pede um ponto a seguir

Macro VBA

Pressione ALT+ F11para abrir o editor VBA. Cole o código em qualquer lugar e execute-o comF5

Sub RegExMark()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Global = True
    RegEx.Pattern = "([\w\d]{3}\.){1,4}[\w\d]{3}"

    Set Matches = RegEx.Execute(ActiveDocument.Range)
    For Each hit In Matches
       Debug.Print hit
       ActiveDocument.Range(hit.FirstIndex, hit.FirstIndex + hit.Length). _
         HighlightColorIndex = wdYellow
    Next hit

End Sub

Embargo

Conforme marcado em vermelho na imagem de exemplo, o padrão atual tem uma falha e também corresponde a substrings de strings que são muito longas. Brinquei um pouco com \b, [^\.]mas \snenhum deles funcionou para todos os casos. Talvez outros usuários possam encontrar uma solução válida?

Recursos usados

Responder2

Sugiro copiar o texto para o Notepad++ e usar a opção RegEx para fazer as alterações.

Eu sei que parece chato, mas depois que você se acostumar, poderá alternar entre os programas muito rapidamente.

O RegEx é uma opção na janela Localizar/Substituir no Notepad++. Outros editores possuem o mesmo recurso.

Ivan

Responder3

Se você realmente precisar usar o método find do objeto range no Word, acho que precisará de várias execuções no texto, cada vez usando um dos seguintes caracteres curinga de pesquisa:

  1. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  2. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  3. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[ !.a-z0-9A-Z]

  4. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[ .][!a-z0-9A-Z]

  5. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@). ([a-z0-9A-Z]@) [!.a-z0-9A-Z]

  6. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@). ([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  7. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@). ([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  8. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@). ([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

O primeiro de cada grupo encontrará um ver # seguido por um não ponto ou alfanum. O segundo encontrará um ver# que termina em um ponto final, como o final de uma frase.

Esses curingas encontrarão uma seleção começando pelo caractere antes do # do verso até os 2 caracteres após o # da versão. Os subgrupos serão extraídos e atribuídos corretamente, entretanto.

Existem 2 problemas aqui com o uso do método find do Word usado com curingas. Uma é que a palavra não tem como especificar 0 ou mais de um determinado caractere ou grupo dos mesmos. Isso elimina alguns métodos fáceis de correspondência que podem ser manipulados pela função regex.

O segundo problema é que um ponto final dentro da versão # parece o fim de uma palavra, portanto os colchetes angulares são redundantes para o uso do ponto final no curinga. Os colchetes angulares também não devem ser usados ​​externamente, pois causam uma falsa correspondência quando um ver # com um pequeno número de subgrupos é encontrado dentro de uma string com um maior número de subgrupos.

Também preciso acrescentar que se você executar "find" e depois "replace", deverá alterar a seleção retornada pela execução "find" para que seu final seja igual ao final do documento (espero que você tenha salvo anteriormente este valor) . Isso ocorre porque o comando de substituição não encontrará novamente a seleção correspondente se a seleção for igual ao texto "localizar". Eu sei que isso é verdade para localizações/substituições não curinga. Melhor prevenir do que remediar.

informação relacionada