2009-03-04 10 views
26

Ho una stringa in un ciclo e per ogni ciclo è pieno di testi l'aspetto simile a questo:Prendi il primo Int (s) in una stringa con javascript

"123 Ciao a tutti 4" "4567 cose è divertente 67 " " 12368 altre cose "

Voglio solo recuperare i primi numeri fino al testo nella stringa e naturalmente non conosco la lunghezza.

Grazie in anticipo!

+0

Se * sai * c'è un numero nella stringa, puoi usare questo one-liner: "" Ciao 123! 45 ".match (/ \ d + /). Shift();' Altrimenti, vorrai testare per 'null' prima di fare' .shift() '. [Source] (https://stackoverflow.com/ a/609588/114558) – rinogo

risposta

39

Se il numero è all'inizio della stringa:

("123 hello everybody 4").replace(/(^\d+)(.+$)/i,'$1'); //=> '123' 

Se è da qualche parte nella stringa:

(" hello 123 everybody 4").replace(/(^.+)(\w\d+\w)(.+$)/i,'$2'); //=> '123' 

E per una numero tra i caratteri:

("hello123everybody 4").replace(/(^.+\D)(\d+)(\D.+$)/i,'$2'); //=> '123' 

[addendum]

Un'espressione regolare per abbinare tutti i numeri in una stringa:

"4567 stuff is fun4you 67".match(/^\d+|\d+\b|\d+(?=\w)/g); //=> ["4567", "4", "67"] 

È possibile mappare la matrice con conseguente a un array di numeri:

"4567 stuff is fun4you 67" 
    .match(/^\d+|\d+\b|\d+(?=\w)/g) 
    .map(function (v) {return +v;}); //=> [4567, 4, 67] 

Compresi i galleggianti:

"4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) 
    .map(function (v) {return +v;}); //=> [4567, 4, 2.12, 67] 

Se esiste la possibilità che la stringa non contiene alcun numero, utilizzare:

("stuff is fun" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}); //=> [] 

Così, per recuperare i numeri di partenza o alla fine della stringa di 4567 stuff is fun4you 2.12 67"

// start number 
var startingNumber = ("4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}).shift(); //=> 4567 

// end number 
var endingNumber = ("4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}).pop(); //=> 67 
+0

Questi non funzionano molto bene. ("ciao123"). replace (/(^.+\D)(\d+)(\D.+$)/i,'$2 ') restituisce "ciao124". In effetti, nessuno di questi funziona se il numero è alla fine della stringa. – user1311069

+1

@ user1311069: beh, quella situazione non è stata inclusa nella risposta. Sarebbe costruttivo se tu avessi fornito la soluzione. Sentiti libero;) – KooiInc

+1

@ user1311069: hai fornito alcuni metodi extra, soddisfacendo anche le tue necessità. – KooiInc

5

Se si desidera un numero intero, solo parseInt(myString, 10). (Il 10 significa base 10, in caso contrario, JavaScript può tentare di utilizzare una base diversa, come 8 o 16.)

39
var str = "some text and 856 numbers 2"; 
var match = str.match(/\d+/); 
document.writeln(parseInt(match[0], 10)); 

Se le stringhe inizia con il numero (forse preceduto da spazi bianchi), semplice parseInt(str, 10) è sufficiente. parseInt salterà lo spazio vuoto iniziale.

10 è necessario, perché altrimenti stringa come 08 verrà convertito 0 (parseInt nella maggior parte delle implementazioni considerare numeri con 0 come ottale).

+3

Data l'espressione regolare '/ \ d + /' non hai veramente bisogno di 'parseInt', qualcosa come' + match.shift() 'o' Number (match.shift()) 'è sufficiente. Inoltre, è necessario verificare se esiste effettivamente una corrispondenza. La stringa di input potrebbe non contenere affatto numeri: in questo caso 'match' sarà' null'. – KooiInc

1

utilizzare le espressioni regolari:

var re = new RegExp(/^\d+/); //starts with digit, one or more 
var m = re.exec("4567 stuff is fun 67"); 
alert(m[0]); //4567 

m = re.exec("stuff is fun 67"); 
alert(m); // null 
Problemi correlati