Estoy intentando buscar texto en Word 2010 en el siguiente formato: ABC.DEF.XYZ. Básicamente, se trata de encontrar referencias de código, utilizando la sintaxis de Java, escritas en el documento de Word. Tenga en cuenta que una referencia de 3 elementos es solo un ejemplo. Las referencias reales tienen un mínimo de 2 elementos y hasta 5 elementos.
He probado numerosas combinaciones de comodines (y no comodines) para que esto funcione, pero no he tenido suerte. Estas son algunas de las cosas que he probado:
<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
NOTA, esto realmente funciona para encontrar una referencia de 2 elementos. Ha sido un éxito o un fracaso al encontrar el patrón dentro de una cadena más grande (por ejemplo, hacer coincidir los elementos 2 y 3 de una referencia de 3 elementos)<([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
Da un error: patrón no válido<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
Tarda tanto en ejecutarse que Word se quedó colgado durante más de 15 minutos y no encontró ni una sola coincidencia (el documento tiene aproximadamente 150 páginas de texto, por lo que tal vez fue demasiado para manejarlo)<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
De hecho, Word falló cuando probé este.
Idealmente, creo que una versión funcional del n.° 2 sería ideal; sin embargo, no sé cómo hacer que el patrón sea válido.
Si esto no es posible, podría usar el número 1 y esperar que capte todo (no estoy seguro de por qué coincide con ciertas cadenas y no con otras).
Cualquier ayuda es muy apreciada.
Respuesta1
Puede utilizar el motor VBA RegEx de Word en lugar de la búsqueda con comodines de Word.
Ok, la tarea era encontrar todas las cadenas con el siguiente patrón.
###.###
###.###.###
###.###.###.###
###.###.###.###.###
El mejor patrón que pude crear fue
([\w\d]{3}\.){1,4}[\w\d]{3}
que devuelve los siguientes hits marcados con amarillo
Explicación del patrón
\w
coincide con un solo personaje de Az. No distingue entre mayúsculas y minúsculas\d
coincide con un dígito 0-9[\w\d]{3}
coincide con 3 caracteres o dígitos comoABC
,abc
,123
,Ab1
- pero noA$C
oABCD
([\w\d]{3}\.){1,4}
Coincide con 1, 2, 3 o 4 grupos con un punto siguiente\.
. El último grupo[\w\d]{3}
no pide un punto de seguimiento.
macro VBA
Presione ALT+ F11para abrir el editor VBA. Pegue el código en cualquier lugar y ejecútelo conF5
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
Advertencia
Como se marca en rojo en la imagen de ejemplo, el patrón actual tiene un defecto y también coincide con subcadenas de cadenas que son demasiado largas. Jugué un poco con \b
y ninguno de ellos funcionó para todos los casos [^\.]
. \s
¿Quizás otros usuarios puedan encontrar una solución válida?
Recursos usados
Respuesta2
Sugeriría copiar el texto en Notepad++ y luego usar la opción RegEx para realizar los cambios.
Sé que suena molesto, pero una vez que te acostumbras, puedes pasar de un programa a otro muy rápidamente.
RegEx es una opción en la ventana Buscar/Reemplazar en Notepad++. Otros editores tienen la misma característica.
Iván
Respuesta3
Si realmente necesita utilizar el método de búsqueda del objeto de rango en Word, creo que necesitará varias ejecuciones en el texto, utilizando cada vez uno de los siguientes comodines de búsqueda:
[!.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]
El primero de cada grupo encontrará un número de versión seguido de un punto sin punto o alfanum. El segundo encontrará un ver# que termine en un punto como el final de una oración.
Estos comodines encontrarán una selección desde el carácter anterior al número de versión hasta los 2 caracteres posteriores al número de versión. Sin embargo, los subgrupos se extraerán y asignarán correctamente.
Aquí hay 2 problemas con el uso del método de búsqueda de palabras utilizado con comodines. Una es que la palabra no tiene una forma de especificar 0 o más de un carácter o grupo de los mismos en particular. Esto elimina algunos métodos sencillos de coincidencia que pueden ser manejados por la función regex.
El segundo problema es que un punto dentro del número de versión parece el final de una palabra, por lo que los corchetes angulares son redundantes para el uso del punto en el comodín. Los corchetes angulares tampoco deben usarse externamente, ya que provocan una coincidencia falsa cuando se encuentra un número de versión con un número pequeño de subgrupos dentro de una cadena con un número mayor de subgrupos.
También necesito agregar que si ejecuta "buscar" y luego "reemplazar", debe cambiar la selección devuelta por la ejecución de "buscar" para que su final sea igual al final del documento (es de esperar que haya guardado este valor previamente) . Esto se debe a que el comando reemplazar no volverá a encontrar la selección coincidente si la selección es igual al texto "buscar". Sé que esto es cierto para búsquedas/reemplazos sin comodines. Mejor prevenir que lamentar.