Separar texto en letras, números y caracteres especiales: 3 enfoques con REGEX y sin REGEX

Un miembro plantea un reto interesante: dado un texto que mezcla letras, números y caracteres especiales (por ejemplo "abc123!@#"), ¿cómo separar cada tipo en columnas distintas? El problema parece sencillo, pero tiene trampa: funciones como BYROW o MAP no pueden desbordar varios valores por iteración, lo que genera errores de #CALC!.

La comunidad responde con tres enfoques muy distintos.

El primero usa REGEXEXTRACCION + LAMBDA + MAP. Se crea una función LAMBDA reutilizable que recibe el patrón regex y lo aplica con MAP a todo el rango:

``
=LET(
L; LAMBDA(z;
MAP(A2:A4; LAMBDA(x;
CONCAT(REGEXEXTRACCION(x; z; 1))
))
);
APILARH(
L("[A-Za-z]");
--L("\\d+");
L("[^A-Za-z0-9]")
)
)
`

El segundo enfoque usa REGEXREEMPLAZAR de forma ultracompacta. Inspirada en una solución de JvdV (referente mundial en REGEX para Excel), esta fórmula usa una constante matricial de tres patrones para eliminar lo que NO es cada tipo:

`
=LET(
a; REGEXREEMPLAZAR(A2:A4; {"\PL"; "\D"; "[^\W_]"}; );
SI.ERROR(--a; a)
)
`

Los patrones \PL (no-letras), \D (no-dígitos) y [^\W_] (no-especiales) hacen todo el trabajo. El SI.ERROR(--a; a) convierte los números de texto a número real.

Para quienes no tienen acceso a las funciones REGEX, un tercer enfoque sin REGEX usa REDUCE + FILTRAR + CODIGO, descomponiendo cada carácter con EXTRAE + SECUENCIA y clasificándolos por rangos de CODIGO:

`
=EXCLUIR(
REDUCE(0; Z19:Z21; LAMBDA(a; v;
LET(
F; FILTRAR; C; CONCAT; CD; CODIGO;
_t; EXTRAE(v; SECUENCIA(LARGO(v)); 1);
APILARV(a; APILARH(
C(F(_t; (CD(_t)>=65) (CD(_t)<=122)));
C(F(_t; (CD(_t)>=48) (CD(_t)<=57)));
C(F(_t; (CD(_t)<48) + (CD(_t)>122) + ((CD(_t)>57) * (CD(_t)<65))))
))
)
));
1
)
`

Tres caminos al mismo destino: REGEX moderno y compacto, REGEX con LAMBDA` reutilizable, o funciones clásicas para quienes aún no tienen REGEX disponible.

Más contenido de Excel en InflueXcel