Estoy tratando de hacer una expresión regular para contar ceros a la izquierda en los siguientes formatos: 01, 001 y 0001.

Estas son algunas identificaciones que necesito procesar de alguna manera.

Intenté algo como esto:

id.split(/^0{1,3}/)

Por ejemplo, si mi entrada es 0001, me gustaría ver algo como esto:

['0', '0', '0']

Pero estoy entendiendo esto:

["", "1"]

Solo me importan los ceros iniciales, y no puedo contar los que están después del formato que especifiqué.

1
danibrum 28 oct. 2019 a las 23:19

3 respuestas

La mejor respuesta

Usa match para que puedas obtener los ceros. Con eso, puedes leer la longitud. Si no hay coincidencia, devuelve nulo.

var str = "0001"
var match = str.match(/^0+/)
var level = match ? match[0].length : 0

En una linea

var str = "0001"
var level = (str.match(/^0+/) || [''])[0].length
1
Wiktor Stribiżew 28 oct. 2019 a las 21:37

Podrías tenerlo todo sin ninguna expresión regular:

let somenumber = "0001";

function count_leading_zeros(some_input) {
    let splitted = some_input.split("");
    let i = 0;
    while (splitted.shift() == 0) {
        i += 1;
    }
    return i;
}

console.log(count_leading_zeros(somenumber));
1
Jan 28 oct. 2019 a las 20:27

String#split divide las cadenas en partes donde la expresión regular coincide con la parte de la cadena. Por lo tanto, se esperan los resultados que obtiene, 001 cuando se divide con /^0{1,3}/ (los primeros 1, 2 o 3 ceros) producirá una cadena vacía (al comienzo de la cadena) y 1 .

Desea utilizar una expresión regular que siempre coincida con cualquier número de ceros al comienzo de la cadena:

console.log('001'.match(/^0*/)[0].length); // => 2
console.log('01'.match(/^0*/)[0].length);  // => 1
console.log('1'.match(/^0*/)[0].length);   // => 0

No es necesario utilizar || ni ningún tipo de protección aquí ya que /^0*/ siempre coincide, cualquier cantidad de ceros (0*) al comienzo de la cadena (^).

1
Wiktor Stribiżew 28 oct. 2019 a las 21:48