Pele todos los caracteres no numéricos de la cadena en JavaScript


701

Considere un escenario que no sea DOM donde desee eliminar todos los caracteres no numéricos de una cadena usando JavaScript / ECMAScript. Cualquier personaje que esté dentro del rango 0 - 9debe mantenerse.

var myString = 'abc123.8<blah>';

//desired output is 1238

¿Cómo lograrías esto en JavaScript simple? Recuerde que este es un escenario que no es DOM, por lo que jQuery y otras soluciones que involucran eventos de navegador y pulsación de teclas no son adecuadas.

Respuestas:


1431

Use el .replacemétodo de la cadena con una expresión regular de \D, que es una clase de caracteres abreviados que coincide con todos los no dígitos:

myString = myString.replace(/\D/g,'');

55
Gracias csj; ¿Dónde encontrar más información \D?
p.campbell

34
Esta es mi referencia de expresiones regulares predeterminada: regular-expressions.info/reference.html Las clases de caracteres incorporadas tienen complementos incorporados. \ d \ D (dígitos versus todo menos dígitos) \ w \ W (caracteres de palabras versus todo menos caracteres de palabras) \ s \ S (espacios en blanco versus todo menos espacios en blanco)
csj

3
Para ser claros, aquí está la sintaxis para reemplazar: w3schools.com/jsref/jsref_obj_regexp.asp porque las barras diagonales y la "g" son parte de ese comando, no parte del RegEx.
Mike K

¿ replaceFunciona con esta sintaxis exacta en todos los navegadores? Parece que recuerdo haber obtenido una object has no method 'replace' versión anterior de IE al usar esto con texto que tomé con jQuery ... o algo así.
cwd

@cwd No tengo idea de lo que ha sido compatible con navegadores anteriores o actuales. La pregunta especificaba un contexto que no era DOM, por lo que es probable que el póster estuviera creando secuencias de comandos en un entorno que no sea un navegador web.
csj

354

Si necesita esto para dejar el punto para los números flotantes, use esto

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

66
¿Algún experto en expresiones regulares? Cómo hacer que esto permita solo un punto (muy relevante con los números). ¡Gracias!
Kasperi

1
¿Qué quieres decir? dar ejemplo de entrada y salida
max4ever

2
No es bueno: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.En caso despojar a cualquier cadena que podría rodear un número ..
VSYNC

2
@ max4ever me salvaste la vida, gracias por manejar el -caso del número (negativo) :)
Pankaj Parkar

44
@Kasperi quizás:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy


23

Puede usar un RegExp para reemplazar todos los caracteres que no sean dígitos:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

22

Algo en la línea de:

yourString = yourString.replace ( /[^0-9]/g, '' );

10
No es exactamente una respuesta a la pregunta original, sino una versión para manejar el punto decimal:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai


0

En Angular / Ionic / VueJS, se me ocurrió un método simple de:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Uso en la vista:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

0

Lamentablemente, ninguna de las respuestas anteriores funcionó para mí.

Estaba buscando convertir números de moneda de cadenas como $123,232,122.11(1232332122.11) o USD 123,122.892(123122.892) o cualquier moneda como ₹ 98,79,112.50(9879112.5) para darme una salida numérica que incluye el puntero decimal.

Tuve que hacer mi propia expresión regular que se parece a esto:

str = str.match(/\d|\./g).join('');

0

Función corta para eliminar todos los caracteres no numéricos pero mantener el decimal (y devolver el número):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


-5

estamos en 2017 ahora también puedes usar ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

o

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

El resultado es

1238

12
Esta es una forma muy ineficiente de realizar esta operación.
djheru

¿Qué es ineficiente o malo aquí?
Vladislav Kostenko

55
Convierte la cadena en una matriz de cadenas de un solo carácter a través de un método adicional, y luego aplica la función de filtro sobre JavaScript en cada elemento de la matriz, devolviendo una nueva matriz de cadenas, para finalmente unir esa matriz nuevamente en una cadena. Regex toma una cadena y devuelve una cadena y el procesamiento se realiza a través del código nativo.
ShortFuse
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.