web-dev-qa-db-fra.com

TypeScript chaîne remplacer par regex, groupes et chaîne partielle

Je veux utiliser regex pour formater un nombre à l'intérieur d'une entrée lorsque je le tape.
Mon problème est le suivant: comme j'utilise des groupes pour formater le nombre, il ne formate que lorsque la chaîne correspond à l'expression régulière .
Le numéro complet est le suivant: 12312312312 | Le formaté ressemblerait à ceci: 123.123.123-12

Si je tape 1231231 par exemple, il ne formate pas en 123.123.1 comme je le pensais, uniquement si je tape le nombre entier.

Ceci est ma fonction: 

format(value){
    // This function returns the formatted string on user input
    return value.replace(/(\d{3})(\d{3})(\d{3})(\d+)/, "\$1.\$2.\$3-\$4");
}

Existe-t-il un moyen de rendre les optionnels des groupes restants?

4
Rafael

Vous pouvez le faire en utilisant

function formatStr(str){
  str = str.replace(/(\d{1,3})(\d{0,3})(\d{0,3})(\d{0,2})/g, function(a, b, c, d, e){
        let ret = "";
        if(b != "")
            ret = b;
        if(c != "")
            ret = ret+"." + c;
        if(d != "")
            ret = ret+"." + d;
        if(e != "")
            ret = ret+"-" + e;
        return ret;
  })
  console.log(str);
}

formatStr('12312312312');
formatStr('1231231');

9
marvel308

Vous pouvez utiliser cette fonction format avec 2 appels à .replace:

  1. D'abord on insère un point tous les 3 chiffres
  2. Deuxièmement, nous remplaçons le troisième point par un trait d'union

Code:

function format(value) {
    // This function returns the formatted string on user input
    return value.replace(/(\d{3})/g, '$1.')
                .replace(/((?:\d{3}\.){2}\d{3})\./, '$1-');
}

console.log(format('1231231'));  //=> 123.123.1
console.log(format('12312312312')); //=> 123.123.123-12

0
anubhava