Explicación de la expresión de búsqueda

Explicación de la expresión de búsqueda

Tengo varios archivos de texto con algo similar a los siguientes ejemplos:

{
    {
        1,
        text1,
        text2,
    }
}
{
    {
        52,
        text1,
        text2,
    }
}
{
    {
        105,
        text1,
        text2,
    }
}

Me preguntaba cómo podría realizar una búsqueda masiva en varios archivos y reemplazarlos de la siguiente manera:

{
    {
        17001,
        text1,
        text2,
    }
}
{
    {
        17052,
        text1,
        text2,
    }
}
{
    {
        17105,
        text1,
        text2,
    }
}

Básicamente, agregaría 17,000 a cada uno de los primeros números después de cada paréntesis de apertura doble. Intenté usar \d\d\d para reemplazar números con 17\d\d\d pero luego me daba 17ddd la letra, no el número. Ayuda por favor

Respuesta1

Tienes dos problemas:

  1. En la cadena de reemplazo \dsignifica "imprimir un d" y nada más. Todas las expresiones regulares especiales como \dy \w, etc. solo funcionan en el patrón de búsqueda, no en la cadena de reemplazo.
  2. Como dijo @DavidPostill, Notepad++ no puede hacer cálculos en la búsqueda/reemplazo de expresiones regulares.

Tienes tres opciones para hacer lo que quieras:

  1. Utilice algún programa, script o complemento para realizar los reemplazos por usted. Cualquier versión de eso, como dice el comentario mencionado anteriormente, está fuera de tema aquí.
  2. Utilice la búsqueda y reemplazo de Notepad ++ 3 veces.
    • Primera ronda para un solo dígito,
    • Ronda dos para dos dígitos, y
    • Ronda tres para tres dígitos.
  3. Si tiene Notepad++ superior a v6.0, puede usar la sintaxis PCRE en la expresión regular y usar elexcelente respuestapor @ACR para hacerlo todo de una sola vez.

Para lograr esto en el método de tres pasos, siga los siguientes pasos. Es posible que tengas que modificar los patrones de búsqueda para capturar lo que deseas y sólo lo que deseas. Funcionan en el ejemplo que proporcionó anteriormente, pero sus archivos pueden ser más complejos que el ejemplo.

Ronda uno

Encuentra esto:

(\s+)(\d),

Reemplace con esto:

\11700\2,

Segundo round

Encuentra esto:

(\s+)(\d\d),

Reemplace con esto:

\1170\2,

Tercera ronda

Encuentra esto:

(\s+)(\d\d\d),

Reemplace con esto:

\117\2,

Que hace

En el Find thispatrón, \s+se encuentran todos los espacios en blanco que se pueden encontrar antes del siguiente token, lo que requiere al menos uno para evitar que un número coincida después de algo que no sea un espacio en blanco. Lo ()que lo rodea lo convierte en la primera cadena capturada devuelta por la coincidencia. En su lugar, coincide \dcon un dígito y los grupos \d\dhacen \d\d\dque coincida con 2 o tres dígitos exactamente. Nuevamente, ()conviértelo en un grupo de captura, el segundo esta vez. Finalmente, ,coincide con la coma después de los números, lo que la mantiene en la misma línea en su archivo de muestra.

En Replace with this, \1se reemplaza por el primer grupo de captura (los espacios). 1700, 170e 17imprima la parte que debe agregarse a la línea. Se \2reemplaza por el segundo grupo de captura, que son los dígitos que tiene en el patrón de búsqueda. Finalmente, la coma ,se reemplaza explícitamente, en lugar de desperdiciar un grupo de captura.

Respuesta2

Puede lograr esto con una sola búsqueda y reemplazo. Notepad++ le permite realizar un reemplazo condicional en función de si un grupo coincide.

Encontrar que:

^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$

Reemplazar con:

$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5

Explicación de la expresión de búsqueda

Desde el exterior hacia el interior:

  • Los caracteres ^y $marcan el principio y el final de una línea respectivamente.
  • Coincide (\s*)con el espacio en blanco al principio y (,\s*)coincide con la coma y cualquier espacio en blanco al final de la línea.
  • En el medio tenemos tres grupos diferentes para hacer coincidir 3, 2 o 1 dígitos (usando la {n}sintaxis). Cada grupo va seguido de un ?para marcarlo como posiblemente no coincidente. El orden de los grupos es importante, ya que los grupos se emparejan en el orden en que aparecen. Si hay tres dígitos, el primer grupo coincidirá y no quedarán dígitos para los dos grupos siguientes. Si hay dos dígitos, el primer grupo no coincidirá, el segundo grupo coincidirá y el primer grupo no tendrá ningún dígito que coincida.

Explicación de la expresión de reemplazo

  • El $1y $5coincidirá con el espacio en blanco al principio de la línea y la coma y el espacio en blanco al final de la línea.
  • Los siguientes grupos (enumerados en el orden opuesto agregan "17" más el número correcto de ceros según el grupo que coincidió en la expresión de búsqueda. Por ejemplo, tome el primer grupo (?{2}17$2). Las ?{2}comprobaciones para ver si el grupo 2 coincidió o no Si es así, inserta el siguiente texto: "17" más la coincidencia del grupo 2, que debe ser un número de tres dígitos.

información relacionada