Estoy trabajando en la siguiente función a la que tuve que agregar algunos IF en caso de que la cadena fuera más corta que el formato que esperaban los grupos REGEX:
function getFormatedCPF(unformatedValue) { const onlyDigits = unformatedValue.toString().replace(/[^\d]/g, "").substring(0, 11); if (onlyDigits.length > 9) return onlyDigits.replace(/(\d{3})(\d{3})(\d{3})/, "$1.$2.$3-"); if (onlyDigits.length > 6) return onlyDigits.replace(/(\d{3})(\d{3})/, "$1.$2."); if (onlyDigits.length > 3) return onlyDigits.replace(/(\d{3})/, "$1."); return onlyDigits; }¿Hay alguna manera de eliminar los IF y obtener el mismo resultado solo con Regex? Estoy buscando algo como: completo: 999.999.999-99 parcial: 999.999.9 Porque se llamará a la función cuando la persona esté escribiendo.
Puedes usar
const rx = /^(\d{3})(\d{1,3})?(\d{1,3})?(\d{1,2})?.*/; $('body').on('input', '.val', function(e) { this.value = this.value.replace(/\D+/g,'') .replace(rx, (_,w,x,y,z) => z ? `${w}.${x}.${y}-${z}` : y ? `${w}.${x}.${y}` : x ? `${w}.${x}` : w); }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input class="val" /> Tenga en cuenta que ^(\d{3})(\d{1,3})?(\d{1,3})?(\d{1,2})?.* regex coincide y captura en el Grupo 1 todos tres dígitos (de lo contrario, no tiene sentido agregar . ), luego uno, dos o tres dígitos se capturan en un Grupo 2 opcional (un dígito debe estar allí, o de nuevo, no hay necesidad de insertar un separador), lo mismo ocurre con Grupo 3 y solo hay uno o dos dígitos que se capturan en el Grupo 4. El .* al final coincide con todo lo que queda para recortarlo.
El reemplazo se realiza dentro de una función de flecha, donde el texto de reemplazo se crea dinámicamente, según el grupo que coincida o no.