Búsqueda con comodines de Word 2010: busque texto en formato ABC.DEF.XYZ

Búsqueda con comodines de Word 2010: busque texto en formato ABC.DEF.XYZ

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:

  1. <([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)

  2. <([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
    Da un error: patrón no válido

  3. <([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)

  4. <([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

ingrese la descripción de la imagen aquí

Explicación del patrón

  • \wcoincide con un solo personaje de Az. No distingue entre mayúsculas y minúsculas
  • \dcoincide con un dígito 0-9
  • [\w\d]{3}coincide con 3 caracteres o dígitos como ABC, abc, 123, Ab1- pero no A$CoABCD
  • ([\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 \by 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:

  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]

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.

información relacionada