viernes, 5 de noviembre de 2010

Referencias a tokens de expresiones regulares en Notepad++

En vez de $1 hay que poner \1.

$1,$2,... es el formato estándar para hacer referencia a un token de la expresión regular con el que se ha encontrado la coincidencia.

Pero en el editor notepad++, si queremos buscar/reemplazar, usando expresiones regulares, debemos usar el formato \1,\2,... en vez de $1,$2,...

Por ejemplo, tengo las siguientes cadenas:

aaa342
bbb545

y me quiero quedar sólo con la parte de los números de cada cadena.
Entonces invoco el menú buscar/reemplazar de notepad++ (ctrl+h directamente, o bien, ctrl+f y pestaña 'reemplazar' o 'replace'):

buscar: [a-z]*([0-9]*)
reemplazar: \1

Y obtengo:

342
545

Al coincidir la expresión regular, las partes rodeadas por (), se pueden referenciar por identificadores, cuyo índice va en el orden de ocurrencia de dichos bloques, de izquierda a derecha y en los anidamientos de fuera hacia dentro.

Buenas herramientas para probar expresiones regulares online y offline.

Online:

(Aplicaciones web)

Offline:

(Aplicaciones para descargar)

27 comentarios :

  1. Comprobar expresiones regulares on line español:
    http://regexpre.orgfree.com/

    ResponderEliminar
  2. FrAnCzOrR, gracias por la recomendación. Sencillo, correcto, pero poco útil si se le va a dar un uso profesional e intenso. Pudiendo utilizar un tester de expresiones regulares, porque utilizar un validador? Los tester por lo menos te permiten comprobar si los match se están haciendo correctamente y como tú te esperas.
    En esa utilidad que recomiendas me falta:
    1- La ventana para el valor a pro-B-ar debería poder redimensionarse también y estaría bien que por defecto ya fuera grande. Mejor que ambas sean lo suficientemente grandes como para no recurrir a la necesidad de redimensionarlas, es una impresión bastante molesta que puede quitarle usuarios.
    2-Quiero ver destacadas las partes del contenido a probar que hacen match, y en tiempo real, no quiero tener que pulsar cada 2 por tres al botón.

    Todo esto me lo ofrecen las herramientas que he recomendado y que cuando he necesitado he utilizado intensamente. Sobre todo la de gskinner.com

    No es nada personal, es más aún te agradezco muchísimo que hayas recomendado esta utilidad, sólo quería comentar aspectos que veo vitales en este tipo de herramientas que de vez en cuando uso profesionalmente. Y estaría encantado de oir consejos y críticas,... lo que sea que nos sea útil a todos, para trabajar mejor, más cómodos, más rápido,...

    Muchas gracias FrAnCzOrR!

    ResponderEliminar
  3. Hola ikon24 hice unos cambios de acuerdo a tus observaciones: http://regexpre.orgfree.com/

    ResponderEliminar
  4. Hola,

    Veréis, tengo un fichero txt muy largo dentro del cual hay direcciones de lugares que necesito que necesito.

    He visto que entre direccion y dirección hay 6 saltos de línea. Por lo tanto solo necesito suprimir el texto sobrante que hay entre dirección y dirección para que el txt me quede limpio del texto sobrante.

    O sea, el formato que tengo ahora mismo es este:

    Dirección
    Texto inútil
    Dirección
    Texto inútil
    Dirección
    Texto inútil
    (...)

    Entonces, la dirección ocupa solo una línea. El texto inútil ocupa 6 líneas.
    Me podríais decir como sería la expresión que me permita suprimir el texto que no quiero?

    Gracias y un saludo

    ResponderEliminar
  5. Hola!

    Quisiera hacerle una consulta!

    Tengo un txt con un formato como este:

    1 DIRECCIÓN | CIUDAD
    2 TEXTO INÚTIL
    3 TEXTO INÚTIL
    4 TEXTO INÚTIL
    5 TEXTO INÚTIL
    6 TEXTO INÚTIL
    7 TEXTO INÚTIL
    8 DIRECCIÓN | CIUDAD
    9 TEXTO INÚTIL
    10 TEXTO INÚTIL
    11 TEXTO INÚTIL
    12 TEXTO INÚTIL
    13 TEXTO INÚTIL
    14 TEXTO INÚTIL
    15 DIRECCIÓN | CIUDAD
    (...)

    Para clarificar he enumerado cada fila.

    Yo deseo eliminar todas las filas inútiles (donde hay texto inútil) y juntar todas las filas útiles (o sea, las de las direcciones).
    Si se fija, se repite que hay 6 filas inútiles y una fila útil.

    Como podría hacerlo con notepad++ usando buscar y reemplazar?

    Muchas gracias de antemano y un saludo!

    ResponderEliminar
  6. Por de pronto, con notepad++ no se me ocurre como hacerlo rápidamente. Supongo que hay miles de líneas, porque si no son tantas, creo que sería más fácil borrarlas manualmente.
    Por otro lado, para éste tipo de tareas recomiendo una herramienta maravillosa "sed", disponible en todas las shell que se precien. En windows la podrías tener disponible instalando "Cygwin".
    Aquí te dejo un ejemplo de uso de esa herramienta para hacer lo que intentas hacer.

    http://linuxcommando.blogspot.com/2008/04/use-sed-or-perl-to-extract-every-nth.html

    Yo también estaría encantado de saber cómo se podría hacer fácilmente en notepad++.

    ResponderEliminar
  7. Ahora mismo he descubierto como se podría hacer algo más automático en notepad++.
    Grabar una macro:

    Macro->Comenzar grabación
    1 - Borrar seis líneas (ctrl+L x 6)
    2- Bajar el cursor a la siguiente línea (tecla flecha para abajo).
    Macro->Parar grabación

    Si hay N líneas útiles, habrá que reproducir N veces la macro (pulsando ctrl+shift+P).

    ResponderEliminar
  8. muchas gracias ikon24, funciona a la perfeccion!

    ResponderEliminar
  9. Genial, no sabia para que funcionaba la macro, muchas gracias!!

    ResponderEliminar
  10. hola, quiero hacer una expresión regular para este caso:

    valor a encontrar: fontName="{el_valor_que_sea}"
    reemplazo: (vacio)

    como podría hacerlo con notepad++?

    ResponderEliminar
  11. Entiendo que quieres borrar toda cadena que sea de la forma fontName="{el_valor_que_sea}"
    Yo pondría:
    valor a encontrar: fontName="{[^"]*}"
    reemplazo: (vacío)

    [^"] - significa cualquier carácter distinto a ".
    (no te olvides de marcar el tipo de búsqueda "expresión regular" abajo en el cuadro de búsqueda y reemplazo. Y prueba esa expresión en la pestaña de sólo búsqueda para ver que efectivamente te selecciona los fragmentos que quieres ;)).

    ResponderEliminar
  12. si quiero insertar una linea o un enter al final de cada linea en el registro

    ResponderEliminar
  13. podria ayudarme estoy haciendo una base de datos telefonica de 11 caracteres pero quisiera que cuando traigo de otro lado que viene dos numeros juntos me los pase a la siguiente columna

    ResponderEliminar
    Respuestas
    1. Busca con la expresión 2 números concatenados (captura cada uno de ellos en un grupo '()', a los que podrás hacer referencia en la expresión de reemplazo con /1 y /2), y al reemplazar separas ambos números por un salto de línea(\n): /1\n/2

      Eliminar
  14. Hola Jhon,
    He entendido que podrías tener líneas de la forma:
    abcdefghi12 (9caracteres y 2 números al final)
    que quieres transformar a:
    abcdefghi
    12
    Para esa transformación podrías usar el replace de notepad++ de la siguiente manera:

    Find what:
    (.{9})(\d{2})
    Replace with:
    \1\n\2

    \n es el caracter de salto de línea, con lo que estas diciéndole: coloca el primer grupo que corresponde a los 9 primeros caracteres, luego un salto de línea y luego el grupo formado por dos dígitos, ya en la nueva línea, porque antes colocaste el salto de línea (\n). Jugando con esto seguro que obtienes fácil lo que andabas buscando ;)

    ResponderEliminar
  15. Hola ikon24

    Tengo una lista muy grande de números telefónicos

    521008050299
    521111111111
    521111199272
    521234567890
    521290197952
    521290678852
    521290799452
    521290864152
    521291035352
    521291175252
    .....
    necesito quitarle los 2 primeros dígitos que el la lada (52) como veras a veces aparecen el "52" al final o en medio del número telefonico así que si ocupo la función remplazar en notepad ++ también me remplaza esos "52" que parecen al final o en medio.
    Hay alguna forma de quitar esos primeros dos dígitos en notepad++
    Nota no lo hago en Excel con la función texto en columnas porque la lista es de más de 3 millones y en Excel no me permite poner tantas

    ResponderEliminar
    Respuestas
    1. Claro que la hay. Fácil. Usa la expresión "52(\d+)" para buscar y "\1", para reemplazar. Te dejará en cada línea que empieza por "52", el grupo de dígitos que seguían a ese "52".

      Buscar qué: 52(\d+)
      Reemplazar con: \1

      Espero que te sirva.
      Un saludo!

      Eliminar
  16. Como puedo reemplazar un texto por el mismo texto con una coletilla.

    Ejemplo: texto a buscar: "hola" reemplazarlo por "hola_1"

    Gracias

    ResponderEliminar
    Respuestas
    1. Para éste caso tan simple, no veo sentido en utilizar expresiones regulares. Sería tan sencillo como:
      Buscar: "hola"
      Reemplazar con: "hola_1"

      Si quieres capturar el texto 'hola' y hacer referencia a él en la expresión de reemplazo:
      Buscar: "(hola)"
      Reemplazar con: "\1_1"
      \1 contiene 'hola' capturado por el grupo () en la expresión de búsqueda.

      Eliminar
  17. Como puedo reemplazar un texto por el mismo pero con coletilla:

    Ejemplo: buscar "hola" y reemplazarlo por "hola_1"

    El texto a buscar iria cambiando.

    Gracias

    ResponderEliminar
    Respuestas
    1. 1) Con tu ejemplo, "texto":
      buscar: (texto)
      reemplazar: \1_1
      Para obtener: texto_1

      2) Si quieres buscar "algo"
      buscar: (algo)
      reemplazar: a_\1_bc
      Para obtener: a_algo_bc

      Explicación:
      \1 hace referencia a lo capturado por la expresión del 1er grupo de izqda a derecha,y de fuera hacia dentro, delimitado por (), en la expresión que pongas en "buscar".

      No te olvides de marcar que usas expresiones regulares en el cuadro de diálogo de búsqueda y reemplazo del notepad++, para que entienda que las expresiones que usas en 'buscar' y/o 'reemplazar' contienen expresiones regulares.

      Eliminar
  18. Hola,
    por favor, me podrias ayudar.
    Tengo una lista de mas de 100 numeros en la forma:
    '111111',
    '222222',
    '333333',
    '444444',
    '555555',
    '666666',
    '777777',

    y querria ponerlos en columnas de 3 numeros, por ej:

    '111111','222222','333333',
    '444444','555555','666666',
    '777777',

    ¿se podria realizar utilizando expresiones regulares con el notepal?
    Gracias.

    ResponderEliminar
    Respuestas
    1. En 'buscar', define una expresión que represente tres números, capturados por sendos grupos,
      separados por 2 saltos de línea.Por ejemplo: ([']\d{6}['],)\n([']\d{6}['],)\n([']\d{6}['],)\n
      En 'reemplazar', pones los 3 números seguidos: \1\2\3

      Eliminar
  19. Hola, una consulta
    Necesito borrar por ejemplo:

    Utilizo <nombre=(\w+)
    pero solo encuentra la primer palabra, podrias ayudarme con una expresion que pueda borrar el nombre completo, o como hacer expresiones usando delimitadores.
    Agradezco tu apoyo

    ResponderEliminar
    Respuestas
    1. Pon un ejemplo por favor.
      La expresión \w+ encaja con una cadena de letras sin espacios. Si tu nombre contiene espacios y sólo letras, prueba con:
      \w[\w\s]+\w
      Ésta expresión encaja con cualquier cadena que comience con una letra,seguida por letras o espacios y que acaba en una letra.

      Eliminar
  20. Hola, como estas?
    Quisiera saber si me puedes ayudar con lo siguiente,

    Tengo muchas lineas como estas:

    Deactivate= 15/07/2015
    Deactivate= 01/03/2014
    Deactivate= 02/01/2017
    Deactivate= 31/07/2015
    Deactivate= 08/10/2015
    Deactivate= 17/05/2018

    Todas tienen diferentes fechas y necesito que todas tengan la misma, por ejemplo 01/01/2020 usando el Notepad+++

    Habia pensado en algo asi (\w+)(.)(\s)(\d+)(.)(\d+)(.)(\d+)\ pero no se me da muy bien este tema.

    Gracias!

    ResponderEliminar
    Respuestas
    1. Captura las fechas con una expresión por ejemplo:
      find: \d{2}\/\d{2}\/\d{4}
      replace: 01/01/2020

      Eliminar

Ay payo, coméntame algo, porfa...