Regex utilizza javascript per restituire solo numeri


129

Se ho una stringa come "qualcosa12" o "qualcosa102", come utilizzerei una regex in javascript per restituire solo le parti numeriche?

Risposte:


226

Espressioni regolari:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Ciò restituirebbe una matrice con due elementi all'interno, "102" e "1948948". Operare come si desidera. Se non corrisponde a nessuno, restituirà null.

Per concatenarli:

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

Supponendo che tu non abbia a che fare con decimali complessi, questo dovrebbe bastare, suppongo.


3
err. odio essere pignoli, ma questo restituisce un array, non un oggetto (almeno in chrome).
Maus,

14
Tutti gli array sono comunque oggetti, no?
meder omuraliev il

6
@MuhammadUmer - l'hai provato?
meder omuraliev,

2
@Onza ti manca la barra rovesciata prima del d, quindi.match(/\d+/g)
meder omuraliev

10
@MuhammadUmer, @meder: voi due dovreste unire le forze: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike,

199

Puoi anche rimuovere tutti i caratteri non numerici ( \Do [^0-9]):

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

console.log(word_Without_Numbers)


Bene, tranne per il fatto che l'OP vuole "solo le parti numeriche", non la stringa.
Scott Fraley,

24

Per il numero con la frazione decimale e il segno meno, utilizzo questo frammento:

 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"]

Aggiornamento: - 09/07/2018

Trovato uno strumento che consente di modificare visivamente l'espressione regolare: Parser e Visualizzatore di espressioni regolari JavaScript .

Aggiornare:

Eccone un altro con cui è anche possibile eseguire il debug di regexp: tester regex online e debugger .

Aggiornare:

Un altro: RegExr .

Aggiornare:

Regexper e Regex Pal .


Perfetta, unica soluzione che funziona con decimali e numeri negativi
ArmaGeddON il

17

Se vuoi solo cifre:

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

Ora ottieni le cifre unite


9

Immagino che tu voglia ottenere i numeri dalla stringa. In tal caso, è possibile utilizzare quanto segue:

// 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

1
Giusto per chiarire, get_numbers/1restituisce un array di stringhe, non numeri. Per il tuo esempio, verrebbe restituito: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn,

2

Le risposte fornite in realtà non corrispondono alla tua domanda, il che implicava un numero finale . Inoltre, ricorda che stai recuperando una stringa; se hai davvero bisogno di un numero, lancia il risultato:

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

Se hai a che fare con ID di elementi numerici su una pagina web, il tuo codice potrebbe anche accettare utilmente un Element, estraendo il numero dal suo id(o dal suo primo genitore con un id); se ne hai a Eventportata di mano, puoi probabilmente ottenere Elementanche quello.


Sebbene questa sia una risposta intelligente, non penso che le altre risposte "in realtà non corrispondano alla [domanda]". In effetti le altre risposte sono più versatili. Lavoreranno con numeri finali e numeri al centro. È un po 'presuntuoso supporre che l'OP abbia voluto che funzionasse SOLO con numeri finali.
Xandor,


2

IMO la risposta n. 3 in questo momento di Chen Dachao è la strada giusta da percorrere se vuoi catturare qualsiasi tipo di numero, ma l'espressione regolare può essere abbreviata da:

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

per:

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

Ad esempio, questo codice:

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

genera questo array:

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

Ho macellato un esempio di gradiente lineare MDN in modo da testare completamente la regexp e non è necessario scorrere qui. Penso di aver incluso tutte le possibilità in termini di numeri negativi, decimali, suffissi unitari come deg e%, uso incoerente di virgola e spazio e i caratteri punto / punto e trattino / trattino extra nel testo "lin-grad.ient ". Per favore fatemi sapere se mi manca qualcosa. L'unica cosa che posso vedere che non gestisce è un numero decimale mal formato come "0..8".

Se vuoi davvero un array di numeri, puoi convertire l'intero array nella stessa riga di codice:

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

Il mio codice particolare, che analizza le funzioni CSS, non deve preoccuparsi dell'uso non numerico del carattere punto / punto, quindi l'espressione regolare può essere ancora più semplice:

/-?[\d\.]+/g

2

Utilizzando split e regex:

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

1

Secondo la risposta di @ Syntle, se hai solo caratteri non numerici otterrai un Uncaught TypeError: Cannot read property 'join' of null.

Ciò impedirà errori se non viene trovata alcuna corrispondenza e restituirà una stringa vuota:

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



0

Tutto ciò che hanno altre soluzioni, ma con una piccola convalida

// 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.