Recientemente he tenido que validar el nit de una persona en Guatemala, por lo que me puse hacer pruebas en https://regexr.com/, la expresión regular para dicho propósito fue quedando de la siguiente manera:
/^(([\d]){5,8})(-)?(([\d]){1}|([\w]){1})$/gi
Explicación: los símbolos / representa el inicio de la expresión regular, la cadena puede iniciar con(^) una cadena de números con una longitud entre 5 y 8 (([\d]){5,8}) luego puede venir o no el símbolo de guion (\-)?, luego debe venir una terminación con un número o una letra (([\d]){1}|([\w){1})
Entre las observaciones o mejoras que puede tener es que acepta unicamente de 3 a 8 dígitos{3,8}, el cual puede ir incrementándose según se incremente la cantidad de contribuyentes, al igual que la letra en el final de la cadena, puede ser una letra especifica o cualquier letra.
Aplicado quedaría de la siguiente manera:
HTML:
<input type="text" id="nit" placeholder="Si no tienes nit, coloca CF" class="form-control" onKeyUp="this.value = this.value.toUpperCase();" required readonly>
Javascript:
<script>
nit = $('#nit').val().trim();
if (nit === "") {
alert(Por favor ingresa tu nit, si nunca has tenido nit coloca: CF);
}else {
switch (nit) {
case "CF":
alert("has ingresado el nit: "+nit)M
break;
default:
const patt = new RegExp(/^(([\d]){5,8})(\-)?(([\d]){1}|([\w]){1})$/gi);
if (!patt.test(nit)) {
alert("nit invalido");
} else {
alert("El nit ingresado es: "+nit);
}
break;
}
}
</script>
Implementado y con pruebas resulto muy bien, espero sea de utilidad.