Regex para eliminar ciertos caracteres o texto en Excel

  • Compartir Este
Michael Brown

¿Has pensado alguna vez lo potente que sería Excel si alguien pudiera enriquecer su caja de herramientas con expresiones regulares? Nosotros no sólo lo hemos pensado, sino que hemos trabajado en ello :) Y ahora, puedes añadir esta maravillosa función RegEx a tus propios libros de trabajo y eliminar en un santiamén las subcadenas que coincidan con un patrón.

La semana pasada, vimos cómo utilizar expresiones regulares para reemplazar cadenas en Excel. Para ello, creamos una función personalizada Regex Replace. Resultó que la función va más allá de su uso principal y no sólo puede reemplazar cadenas, sino también eliminarlas. ¿Cómo es posible? En términos de Excel, eliminar un valor no es otra cosa que reemplazarlo por una cadena vacía, algo que nuestra función Regex es¡muy bueno!

    VBA RegExp función para eliminar subcadenas en Excel

    Como todos sabemos, las expresiones regulares no son compatibles con Excel de forma predeterminada. Para habilitarlas, debe crear su propia función definida por el usuario. La buena noticia es que dicha función ya está escrita, probada y lista para su uso. Todo lo que tiene que hacer es copiar este código, pegarlo en su editor VBA y, a continuación, guardar el archivo como una función libro de trabajo habilitado para macros (.xlsm).

    La función tiene la siguiente sintaxis:

    RegExpReplace(text, pattern, replacement, [instance_num], [match_case])

    Los tres primeros argumentos son obligatorios, los dos últimos son opcionales.

    Dónde:

    • Texto - la cadena de texto en la que buscar.
    • Patrón - la expresión regular a buscar.
    • Sustitución - el texto por el que se va a sustituir. A eliminar subcadenas que coincida con el patrón, utilice un cadena vacía ("") para su sustitución.
    • Número_de_instancia (opcional) - la instancia a reemplazar. Si se omite, se reemplazan todas las coincidencias encontradas (por defecto).
    • Caso_partido (opcional) - valor booleano que indica si el texto debe distinguir entre mayúsculas y minúsculas o ignorarlas. Para distinguir entre mayúsculas y minúsculas, utilice TRUE (por defecto); para distinguir entre mayúsculas y minúsculas, utilice FALSE.

    Para más información, consulte la función RegExpReplace.

    Sugerencia. En casos sencillos, puede eliminar caracteres o palabras específicas de las celdas con fórmulas de Excel. Pero las expresiones regulares ofrecen muchas más opciones para ello.

    Cómo eliminar cadenas utilizando expresiones regulares - ejemplos

    Como ya se ha dicho, para eliminar partes del texto que coincidan con un patrón, hay que sustituirlas por una cadena vacía. Así, una fórmula genérica toma esta forma:

    RegExpReplace(text, pattern, "", [instance_num], [match_case])

    Los siguientes ejemplos muestran varias aplicaciones de este concepto básico.

    Eliminar todas las coincidencias o una coincidencia específica

    La función RegExpReplace está diseñada para encontrar todas las subcadenas que coincidan con una expresión regular dada. El cuarto argumento opcional, denominado número_de_instancia .

    El valor predeterminado es "todas las coincidencias" - cuando el número_de_instancia se omiten todas las coincidencias encontradas. Para eliminar una coincidencia concreta, defina el número de instancia.

    En las cadenas siguientes, supongamos que desea eliminar el primer número de orden. Todos los números de este tipo empiezan por el signo almohadilla (#) y contienen exactamente 5 dígitos, por lo que podemos identificarlos utilizando esta expresión regular:

    Patrón : #\d{5}\b

    El límite de palabras \b especifica que una subcadena coincidente no puede formar parte de una cadena mayor, como #10000001.

    Para eliminar todas las coincidencias, la opción número_de_instancia no está definido:

    =RegExpReplace(A5, "#\d{5}\b", "")

    Para erradicar sólo la primera ocurrencia, establecemos la opción número_de_instancia a 1:

    =RegExpReplace(A5, "#\d{5}\b", "", 1)

    Regex para eliminar determinados caracteres

    Para eliminar determinados caracteres de una cadena, basta con escribir todos los caracteres no deseados y separarlos con una barra vertical

    Por ejemplo, para normalizar los números de teléfono escritos en varios formatos, primero nos deshacemos de caracteres específicos como paréntesis, guiones, puntos y espacios en blanco.

    Patrón : \(

    =RegExpReplace(A5, "\(

    El resultado de esta operación es un número de 10 cifras como "1234567890".

    Para mayor comodidad, puede introducir la expresión regular en una celda separada y hacer referencia a esa celda utilizando una referencia absoluta como $A$2:

    =RegExpReplace(A5, $A$2, "")

    A continuación, puede estandarizar el formato como desee utilizando el operador de concatenación (&) y funciones de texto como DERECHA, MEDIA e IZQUIERDA.

    Por ejemplo, para escribir todos los números de teléfono en el formato (123) 456-7890, la fórmula es:

    ="("&IZQUIERDA(B5, 3)&") "&MEDIA(B5, 4, 3)&"-"&DERECHA(B5, 4)

    Donde B5 es la salida de la función RegExpReplace.

    Eliminar caracteres especiales mediante regex

    En uno de nuestros tutoriales, vimos cómo eliminar caracteres no deseados en Excel utilizando funciones incorporadas y personalizadas. Las expresiones regulares facilitan mucho las cosas. En lugar de enumerar todos los caracteres que hay que eliminar, basta con especificar los que quieres conservar :)

    El patrón se basa en clases de caracteres negados - se pone un signo de intercalación dentro de una clase de caracteres [^ ] para que coincida con cualquier carácter individual que NO esté entre paréntesis. El cuantificador + obliga a considerar los caracteres consecutivos como una única coincidencia, de modo que se realiza un reemplazo para una subcadena coincidente en lugar de para cada carácter individual.

    Dependiendo de sus necesidades, elija una de las siguientes expresiones regulares.

    Para eliminar no alfanumérico es decir, todos los caracteres excepto letras y cifras:

    Patrón : [^0-9a-zA-Z]+

    Para purgar todos los caracteres excepto letras , dígitos y espacios :

    Patrón : [^0-9a-zA-Z ]+

    Para borrar todos los caracteres excepto letras , dígitos y guión bajo puede utilizar \W, que significa cualquier carácter que NO sea alfanumérico ni guión bajo:

    Patrón : \W+

    Si desea conservar otros personajes por ejemplo, los signos de puntuación, colóquelos entre paréntesis.

    Por ejemplo, para eliminar cualquier carácter que no sea una letra, un dígito, un punto, una coma o un espacio, utilice la siguiente expresión regular:

    Patrón : [^0-9a-zA-Z\., ]+

    Esto elimina con éxito todos los caracteres especiales, pero los espacios en blanco adicionales permanecen.

    Para solucionarlo, puede anidar la función anterior en otra que sustituya varios espacios por un único carácter de espacio.

    =RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")

    O simplemente utilice la función nativa TRIM con el mismo efecto:

    =TRIM(RegExpReplace(A5, $A$2, ""))

    Regex para eliminar caracteres no numéricos

    Para eliminar todos los caracteres no numéricos de una cadena, puede utilizar esta fórmula larga o una de las expresiones regulares muy sencillas que se indican a continuación.

    Coincide con cualquier carácter que NO sea un dígito:

    Patrón : \D+

    Elimina caracteres no numéricos utilizando clases negadas:

    Patrón : [^0-9]+

    Patrón : [^\d]+

    Sugerencia. Si su objetivo es eliminar el texto y verter los números restantes en celdas separadas o colocarlos todos en una celda separados por un delimitador especificado, utilice la función RegExpExtract como se explica en Cómo extraer números de una cadena utilizando expresiones regulares.

    Regex para eliminar todo lo que aparece después de un espacio

    Para eliminar todo lo que aparece después de un espacio, utilice el espacio ( ) o el carácter de espacio en blanco (\s) para encontrar el primer espacio y .* para coincidir con cualquier carácter que aparezca después.

    Si tiene cadenas de una sola línea que sólo contienen espacios normales (valor 32 en el sistema ASCII de 7 bits), no importa realmente cuál de las expresiones regulares siguientes utilice. En el caso de cadenas de varias líneas, sí importa.

    Para quitar todo después de un espacio utilice esta expresión regular:

    Patrón : " .*"

    =RegExpReplace(A5, " .*", "")

    Esta fórmula eliminará todo lo que aparezca después del primer espacio en cada línea Para que los resultados se muestren correctamente, asegúrese de activar Ajustar texto.

    Para despojarse de todo después de un espacio en blanco (incluyendo un espacio, un tabulador, un retorno de carro y una nueva línea), la expresión regular es:

    Patrón : \s.*

    =RegExpReplace(A5, "\s.*", "")

    Debido a que \s coincide con algunos tipos de espacios en blanco diferentes, incluyendo una nueva línea (\n), esta fórmula borra todo lo que hay después del primer espacio en una celda, sin importar cuántas líneas haya en ella.

    Regex para eliminar texto después de un carácter específico

    Utilizando los métodos del ejemplo anterior, puede erradicar texto después de cualquier carácter que especifique.

    Para tratar cada línea por separado:

    Patrón genérico : char.*

    En cadenas de una sola línea, esto eliminará todo lo que vaya después de char En las cadenas de varias líneas, cada línea se procesará individualmente porque en el sabor Regex de VBA, un punto (.) coincide con cualquier carácter excepto con una nueva línea.

    Para procesar todas las líneas como una sola cadena:

    Patrón genérico : char(.

    Para borrar cualquier cosa después de un carácter dado, incluyendo nuevas líneas, se añade \n al patrón.

    Por ejemplo, para eliminar el texto después de la primera coma de una cadena, pruebe con estas expresiones regulares:

    Patrón : ,.*

    Patrón : ,(.

    En la captura de pantalla siguiente, puede examinar cómo difieren los resultados.

    Regex para eliminar todo lo anterior al espacio

    Cuando trabaje con cadenas largas de texto, a veces puede querer hacerlas más cortas eliminando la misma parte de información en todas las celdas. A continuación trataremos dos de estos casos.

    Elimina todo lo que haya antes del último espacio

    Como en el ejemplo anterior, una expresión regular depende de lo que usted entienda por "espacio".

    Para que todo coincida con el último espacio (se añaden comillas para que se note un espacio después de un asterisco).

    Patrón : ".* "

    Para que coincida con cualquier cosa antes del último espacio en blanco (incluidos un espacio, un tabulador, un retorno de carro y una nueva línea), utilice esta expresión regular.

    Patrón : .*\s

    La diferencia es especialmente notable en las cadenas de varias líneas.

    Quita todo lo que haya antes del primer espacio

    Para que coincida cualquier cosa hasta el primer espacio de una cadena, puede utilizar esta expresión regular:

    Patrón : ^[^ ]* +

    A partir del inicio de una cadena ^, buscamos cero o más caracteres sin espacios [^ ]* que vayan seguidos inmediatamente de uno o más espacios " +". La última parte se añade para evitar posibles espacios iniciales en los resultados.

    Para eliminar el texto antes del primer espacio de cada línea, la fórmula se escribe en el modo por defecto "todas las coincidencias" ( número_de_instancia omitido):

    =RegExpReplace(A5, "^[^ ]* +", "")

    Para eliminar el texto antes del primer espacio de la primera línea y dejar intactas todas las demás líneas, se utiliza la tecla número_de_instancia se fija en 1:

    =RegExpReplace(A5, "^[^ ]* +", "", 1)

    Regex para eliminar todo lo que precede a un carácter

    La forma más sencilla de eliminar todo el texto anterior a un carácter específico es utilizar una expresión regular como ésta:

    Patrón genérico : ^[^char]*char

    Traducido a un lenguaje humano, dice: "desde el inicio de una cadena anclada por ^, coincidir con 0 o más caracteres excepto char [^char]* hasta la primera aparición de char .

    Por ejemplo, para borrar todo el texto antes de los primeros dos puntos, utilice esta expresión regular:

    Patrón : ^[^:]*:

    Para evitar que aparezcan espacios al principio de los resultados, añada un carácter de espacio en blanco \s* al final. Esto eliminará todo lo que haya antes de los primeros dos puntos y recortará los espacios que haya justo después:

    Patrón : ^[^:]*:\s*

    =RegExpReplace(A5, "^[^:]*:\s*", "")

    Sugerencia. Además de las expresiones regulares, Excel tiene sus propios medios para eliminar texto por posición o coincidencia. Para aprender a realizar la tarea con fórmulas nativas, consulte Cómo eliminar texto antes o después de un carácter en Excel.

    Regex para eliminar todo excepto

    Para eliminar todos los caracteres de una cadena excepto los que desea conservar, utilice las clases de caracteres negados.

    Por ejemplo, para eliminar todos los caracteres excepto las letras minúsculas y los puntos, la expresión regular es:

    Patrón : [^a-z\.]+

    De hecho, aquí podríamos prescindir del cuantificador +, ya que nuestra función sustituye todas las coincidencias encontradas. El cuantificador sólo lo hace un poco más rápido: en lugar de manejar cada carácter individual, se sustituye una subcadena.

    =RegExpReplace(A5, "[^a-z.]+", "")

    Regex para eliminar etiquetas html en Excel

    En primer lugar, debe tenerse en cuenta que HTML no es un lenguaje regular, por lo que analizarlo mediante expresiones regulares no es la mejor manera. Dicho esto, las expresiones regulares pueden ayudar a eliminar las etiquetas de las celdas para que el conjunto de datos sea más limpio.

    Dado que las etiquetas html se colocan siempre entre paréntesis angulares, puede encontrarlas utilizando una de las siguientes expresiones regulares.

    Clase negada:

    Patrón ;

    Aquí, coincidimos con un paréntesis angular de apertura, seguido de cero o más apariciones de cualquier carácter excepto el paréntesis angular de cierre [^>]* hasta el paréntesis angular de cierre más cercano.

    Búsqueda perezosa:

    Patrón :

    El signo de interrogación obliga a .* a buscar el menor número posible de caracteres hasta que encuentra un corchete de cierre.

    Sea cual sea el patrón que elija, el resultado será absolutamente el mismo.

    Por ejemplo, para eliminar todas las etiquetas html de una cadena en A5 y dejar el texto, la fórmula es:

    =RegExpReplace(A5, "]*>", "")

    O puede utilizar el cuantificador perezoso como se muestra en la captura de pantalla:

    Esta solución funciona perfectamente para un solo texto (filas 5 - 9). Para textos múltiples (filas 10 - 12), los resultados son cuestionables - los textos de diferentes etiquetas se fusionan en uno. ¿Es esto correcto o no? Me temo que no es algo que se pueda decidir fácilmente - todo depende de su comprensión del resultado deseado. Por ejemplo, en B11, se espera el resultado "A1"; mientras que en B10, es posible que desee"datos1" y "datos2" deben separarse con un espacio.

    Para eliminar las etiquetas html y separar los textos restantes con espacios, puede proceder de este modo:

    1. Sustituye las etiquetas por espacios " ", no por cadenas vacías:

      =RegExpReplace(A5, "]*>", " ")

    2. Reducir varios espacios a un solo carácter de espacio:

      =RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")

    3. Recorte los espacios iniciales y finales:

      =TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))

    El resultado será algo parecido a esto:

    Herramienta de eliminación de Regex de Ablebits

    Si ha tenido la oportunidad de utilizar nuestra Ultimate Suite para Excel, probablemente ya haya descubierto las nuevas Herramientas Regex introducidas con la reciente versión. La belleza de estas funciones Regex basadas en .NET es que, en primer lugar, soportan la sintaxis de expresiones regulares con todas las funciones sin las limitaciones de RegExp de VBA y, en segundo lugar, no requieren la inserción de ningún código VBA en sus libros de trabajo, ya que toda la integración del código se realiza de la siguiente manerapor nosotros en el backend.

    Tu parte del trabajo es construir una expresión regular y servirla a la función :) Déjame mostrarte cómo hacerlo en un ejemplo práctico.

    Cómo eliminar texto entre corchetes y paréntesis mediante regex

    En las cadenas de texto largas, la información menos importante suele aparecer entre [corchetes] y (paréntesis). ¿Cómo se eliminan esos detalles irrelevantes conservando el resto de datos?

    De hecho, ya hemos creado una regex similar para eliminar etiquetas html, es decir, texto entre corchetes angulares. Obviamente, los mismos métodos funcionarán también para corchetes cuadrados y redondos.

    Patrón : (\(.*?\))

    El truco consiste en utilizar un cuantificador perezoso (*?) para que coincida con la subcadena más corta posible. El primer grupo (\(.*?\)) coincide con cualquier cosa desde un paréntesis de apertura hasta el primer paréntesis de cierre. El segundo grupo (\[.*?\]) coincide con cualquier cosa desde un corchete de apertura hasta el primer corchete de cierre. Una barra vertical

    Una vez determinado el patrón, vamos a "alimentarlo" con nuestra función Regex Remove. He aquí cómo hacerlo:

    1. En el Datos de Ablebits en la pestaña Texto grupo, haga clic en Herramientas Regex .

  • En el Herramientas Regex seleccione las cadenas de origen, introduzca la expresión regular, elija la opción Eliminar y pulse Eliminar .

    Para obtener los resultados como fórmulas y no como valores, seleccione la opción Insertar como fórmula casilla de verificación.

    Para eliminar el texto entre corchetes de las cadenas en A2:A5, configuramos los ajustes como sigue:

  • Como resultado, el AblebitsRegexRemove se inserta en una nueva columna junto a los datos originales.

    La función también puede introducirse directamente en una celda mediante la función estándar Función de inserción donde está clasificado en AblebitsUDFs .

    En AblebitsRegexRemove está diseñada para eliminar texto y sólo requiere dos argumentos: la cadena de origen y la expresión regular. Ambos parámetros pueden definirse directamente en una fórmula o suministrarse en forma de referencias de celda. Si es necesario, esta función personalizada puede utilizarse junto con cualquiera de las nativas.

    Por ejemplo, para recortar los espacios sobrantes en las cadenas resultantes, puede utilizar la función TRIM como envoltorio:

    =TRIM(AblebitsRegexRemove(A5, $A$2))

    Así es como se eliminan cadenas en Excel utilizando expresiones regulares. Te doy las gracias por leer y ¡espero verte en nuestro blog la semana que viene!

    Descargas disponibles

    Eliminar cadenas mediante regex - ejemplos (archivo .xlsm)

    Ultimate Suite - versión de prueba (archivo .exe)

    Michael Brown es un entusiasta de la tecnología dedicado y apasionado por simplificar procesos complejos utilizando herramientas de software. Con más de una década de experiencia en la industria de la tecnología, ha perfeccionado sus habilidades en Microsoft Excel y Outlook, así como en Google Sheets y Docs. El blog de Michael está dedicado a compartir su conocimiento y experiencia con otros, brindando consejos y tutoriales fáciles de seguir para mejorar la productividad y la eficiencia. Ya sea un profesional experimentado o un principiante, el blog de Michael ofrece información valiosa y consejos prácticos para aprovechar al máximo estas herramientas de software esenciales.