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:
<([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)<([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
Dá um erro - padrão inválido<([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)<([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
Explicação do padrão
\w
corresponde a um único caractere de Az. Não faz distinção entre maiúsculas e minúsculas\d
corresponde a um dígito 0-9[\w\d]{3}
corresponde a 3 caracteres ou dígitos comoABC
,abc
,123
,Ab1
- mas nãoA$C
ouABCD
([\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 \s
nenhum 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:
[!.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]@)[.][!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]([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]@).([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]@). ([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]@).([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]@).([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.