JSFiddle - React, Tailwind, and code Playground

HTML

<input id="code"/>
<pre>
try entering:
44444444444444444
44144444444444444
</pre>

JavaScript

function formatCode(str){
    var result = str;

    str = str.replace(/\D+/g, "");
    var m = str.match(/^(\d\d)(?:([2-90]\d|1)(?:(\d\d\d)(\d+)?)?)?$/);

    if(m){
        result = m[1] + " ";
        if(m[2]) result += m[2] + " ";
        if(m[3]) result += m[3] + " ";
    
        if(m[4]){
            result += m[4].split(/(\d{4})/).join(" ");
            result = result.replace(/\s+/g, " ");
        }
    }
    
    return result;
}

function update(obj){
    var val = obj.value;
    var got = formatCode(val);
    
    if(got != val)
        obj.value = got;
}

var timer;
var prev_val = "";

$('#code').keyup(function(){
    clearTimeout(timer);
    
    // when adding numbers at the end of input, update at once
    // don't want to update when editing in the middle of the string or removing parts
    // because it would move the carret location to the end of input, and make it unusable
    if(this.value.indexOf(prev_val) == 0){
        update(this);
        prev_val = this.value;
        return;
    }
    
    prev_val = this.value;
    
    // else update 1 second after the changes are done
    timer = setTimeout(update, 1000, this);
});