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.

p.campbell
fuente

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,'');
csj
fuente
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"
max4ever
fuente
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
50

Use una expresión regular, si la implementación de su script los admite. Algo como:

myString.replace(/[^0-9]/g, '');
Auraseer
fuente
12
Por alguna razón, esta forma parece mucho más legible que [^ \ d].
Arman Bimatov
1
¿Cuál es la g para después del delimitador de expresiones regulares?
Native Coder
3
@NativeCoder stackoverflow.com/questions/12993629/…
RagnaRock
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
CMS
fuente
22

Algo en la línea de:

yourString = yourString.replace ( /[^0-9]/g, '' );
Jan Hančič
fuente
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>
Conceder
fuente
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('');
Legión del Caos
fuente
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));

jackosaurio
fuente
-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
Frank Wisniewski
fuente
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