2009-03-04 9 views
26

Mam ciąg w pętli i dla każdej pętli jest ona wypełniona teksty wygląda następująco:Pobierz pierwszy Int (y) w ciąg z javascript

„123 Witam wszystkich 4” „4567 rzeczy jest zabawne 67 " " 12368 więcej rzeczy "

Chcę tylko pobrać pierwsze liczby do tekstu w ciągu znaków, a ja nie znam długości.

Z góry dziękuję!

+0

Jeśli * wiem * w łańcuchu jest numer, możesz użyć tego jednego liniowca: '" Witaj 123! 45 ".match (/ \ d + /). Shift();' W przeciwnym razie będziesz musiał przetestować dla 'null' przed wykonaniem' .shift() '. [Źródło] (https://stackoverflow.com/ a/609588/114558) – rinogo

Odpowiedz

39

Jeśli numer znajduje się na początku łańcucha:

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

Jeśli jest gdzieś w ciągu:

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

a dla liczba między znakami:

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

[dodatek]

Wyrażenie regularne pasujące do wszystkich numerów w ciąg:

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

można mapować wynikowy tablicy do tablicy z numerami:

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

W tym pływaki:

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

Jeżeli istnieje możliwość, że ciąg nie zawiera numeru, należy:

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

Tak więc, aby odzyskać początku lub na końcu liczby ciąg 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

Te nie działają zbyt dobrze. ("hello123"). replace (/(^.+\D)(\d+)(\D.+$)/i,'$2 ') zwraca "hello124". W rzeczywistości żadna z nich nie działa, jeśli liczba znajduje się na końcu łańcucha. – user1311069

+1

@ user1311069: cóż, ta sytuacja nie została uwzględniona w odpowiedzi. Byłoby konstruktywne, jeśli podasz swoje rozwiązanie. Czuj się wolny;) – KooiInc

+1

@ user1311069: dostarczył kilka dodatkowych metod, które zaspokoją również Twoje potrzeby. – KooiInc

5

Jeśli chcesz int, po prostu parseInt(myString, 10). (The 10 oznacza bazę 10; w przeciwnym razie, JavaScript może spróbować użyć innej zasady, takiej jak 8 lub 16.)

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

Jeśli struny zaczyna się od numeru (może być poprzedzony białymi znakami), prosty parseInt(str, 10) wystarczy. parseInt pominie wiodące białe znaki.

10 jest konieczne, ponieważ w przeciwnym razie ciąg jak 08 zostaną przekształcone w 0 (parseInt w większości implementacji pod numery zaczynające 0 jako ósemkowej).

+3

Biorąc pod uwagę wyrażenie regularne '/ \ d + /', naprawdę nie potrzebujesz 'parseInt', coś jak' + match.shift() 'lub' Number (match.shift()) 'jest wystarczające. Ponadto musisz sprawdzić, czy faktycznie istnieje dopasowanie. Ciąg wejściowy nie może w ogóle zawierać liczb: w takim przypadku 'match' będzie mieć wartość' null'. – KooiInc

1

regularne wyrażeń:

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