Regex usando javascript para devolver solo números

129

Si tengo una cadena como "something12" o "something102", ¿cómo usaría una expresión regular en javascript para devolver solo las partes numéricas?

Malcolm
fuente

Respuestas:

226

Expresiones regulares:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Esto devolvería una matriz con dos elementos dentro, '102' y '1948948'. Opere como desee. Si no coincide con ninguno, devolverá nulo.

Para concatenarlos:

'something102asdfkj1948948'.match( numberPattern ).join('')

Suponiendo que no esté tratando con decimales complejos, esto debería ser suficiente.

meder omuraliev
fuente
3
errar. odio ser quisquilloso, pero esto devuelve una matriz, no un objeto (al menos en cromo).
Maus
14
Sin embargo, todas las matrices son objetos, ¿no?
meder omuraliev
66
@MuhammadUmer: ¿lo intentaste?
meder omuraliev
2
@Onza, te estás perdiendo la barra invertida antes del d, así que.match(/\d+/g)
meder omuraliev
10
@MuhammadUmer, @meder: Ustedes dos deben combinar fuerzas: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike
199

También puede quitar todos los caracteres que no sean dígitos ( \Do [^0-9]):

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)

CMS
fuente
Bueno, excepto que el OP quiere "solo las partes numéricas", no la cadena.
Scott Fraley,
24

Para el número con fracción decimal y signo menos, uso este fragmento:

 var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;

'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]

Actualización: - 7/9/2018

Encontró una herramienta que le permite editar visualmente la expresión regular: JavaScript Regular Expression Parser & Visualizer .

Actualizar:

Aquí hay otro con el que incluso puede depurar regexp: probador y depurador de expresiones regulares en línea .

Actualizar:

Otro: RegExr .

Actualizar:

Regexper y Regex Pal .

Chen Dachao
fuente
Solución perfecta y única que funciona con decimales y
números
17

Si solo quieres dígitos:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

Ahora tienes los dígitos unidos

Iván Martínez
fuente
9

Supongo que quieres obtener números de la cadena. En cuyo caso, puede usar lo siguiente:

// Returns an array of numbers located in the string
function get_numbers(input) {
    return input.match(/[0-9]+/g);
}

var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');

alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null
Andrew Moore
fuente
1
Solo para que quede claro, get_numbers/1devuelve una matriz de cadena, no un número. Para su ejemplo, devolvería: * ["102"]* ["102", "12"]* nulo
Sơn Trần-Nguyễn
2

Las respuestas dadas en realidad no coinciden con su pregunta, lo que implica un número final . Además, recuerde que está recuperando una cadena; si realmente necesita un número, arroje el resultado:

item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);

Si se trata de identificadores numéricos de elementos en una página web, su código también podría aceptar un Element, extrayendo el número de su id(o su primer padre con un id); si tienes un Eventpráctico, es probable que también puedas obtenerlo Element.

Pete Jordan
fuente
Si bien esta es una respuesta ingeniosa, no creo que las otras respuestas "en realidad no coincidan con [la] pregunta". De hecho, las otras respuestas son más versátiles. Trabajarán con números finales y con números en el medio. Es un poco presuntuoso suponer que el OP quería que SOLO funcionara con números finales.
Xandor
2
var result = input.match(/\d+/g).join([])
PavelGora
fuente
2

En mi opinión, la respuesta n. ° 3 de Chen Dachao en este momento es el camino correcto si desea capturar cualquier tipo de número, pero la expresión regular se puede acortar de:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

a:

/-?\d*\.?\d+/g

Por ejemplo, este código:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

genera esta matriz:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

He descifrado un ejemplo de gradiente lineal MDN para que pruebe completamente la expresión regular y no necesite desplazarse aquí. Creo que he incluido todas las posibilidades en términos de números negativos, decimales, sufijos de unidades como deg y%, coma incoherente y uso del espacio, y los caracteres adicionales de punto / punto y guión / guión dentro del texto "lin-grad.ient ". Por favor, avíseme si me falta algo. Lo único que puedo ver que no maneja es un número decimal mal formado como "0..8".

Si realmente desea una matriz de números, puede convertir la matriz completa en la misma línea de código:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

Mi código particular, que analiza las funciones CSS, no necesita preocuparse por el uso no numérico del carácter punto / punto, por lo que la expresión regular puede ser aún más simple:

/-?[\d\.]+/g
jamess
fuente
2

Usando split y regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123
SridharKritha
fuente
1

Según la respuesta de @ Syntle, si solo tiene caracteres no numéricos, obtendrá un Uncaught TypeError: Cannot read property 'join' of null.

Esto evitará errores si no se encuentran coincidencias y devolverá una cadena vacía:

('something'.match( /\d+/g )||[]).join('')

Marcelo Viana
fuente
0

Si también desea números separados por puntos / comas, entonces:

\d*\.?\d*

o

[0-9]*\.?[0-9]*

Puede usar https://regex101.com/ para probar sus expresiones regulares.

qristjan
fuente
0

Todo lo que tienen otras soluciones, pero con un poco de validación.

// value = '675-805-714'
const validateNumberInput = (value) => { 
    let numberPattern = /\d+/g 
    let numbers = value.match(numberPattern)

    if (numbers === null) {
        return 0
    }  

    return parseInt(numbers.join([]))
}
// 675805714
Frager
fuente