2009-03-04 9 views
26

Ich habe eine Zeichenfolge in einer Schleife und für jede Schleife wird es mit Texten, die wie folgt aussieht gefüllt:Holen Sie sich das erste Int (n) in einer Zeichenfolge mit Javascript

„123 hallo alle 4“ „4567 Sachen ist Spaß 67 " " 12368 mehr Zeug "

Ich möchte nur die ersten Nummern bis auf den Text in der Zeichenfolge abrufen, und ich weiß natürlich nicht die Länge.

Vielen Dank im Voraus!

+0

abrufen Wenn Sie * wissen * Da ist eine Nummer in der Zeichenfolge, Sie können diesen Einzeiler verwenden: '" Hallo 123 da! 45 ".match (/ \ d + /). Shift();' Andernfalls sollten Sie vor dem '.shift()' auf 'null' prüfen. [Quelle] (https://stackoverflow.com/ a/609588/114558) – rinogo

Antwort

39

Wenn die Zahl zu Beginn der Zeichenfolge:

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

Wenn es irgendwo in der Kette:

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

Und für ein Anzahl zwischen Zeichen:

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

[Nachtrag]

Ein regulärer Ausdruck alle Zahlen in einer Zeichenfolge entsprechen:

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

Sie können das resultierende Array in ein Array von Zahlen Karte:

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

Einschließlich Schwimmer:

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

Wenn die Möglichkeit besteht, dass die Zeichenfolge enthält keine Zahl, verwenden:

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

So, Anfang oder Ende Zahlen des Strings 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

Diese funktionieren nicht sehr gut. ("hallo123"). replace (/(^.+\D)(\d+)(\D.+$)/i,'$2 ') gibt "hello124" zurück. Tatsächlich funktioniert nichts davon, wenn die Nummer am Ende der Zeichenfolge steht. – user1311069

+1

@ user1311069: Nun, diese Situation wurde nicht in der Antwort enthalten. Es wäre konstruktiv, wenn Sie Ihre Lösung dafür bereitstellen würden. Fühlen Sie sich frei;) – KooiInc

+1

@ user1311069: ein paar zusätzliche Methoden zur Verfügung gestellt, die Sie auch erfüllen müssen. – KooiInc

5

Wenn Sie ein int möchten, nur parseInt(myString, 10). (Die 10 bedeutet Basis 10, andernfalls kann JavaScript versuchen, eine andere Basis zu verwenden, wie zum Beispiel 8 oder 16.)

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

Wenn die Saiten mit der Nummer beginnen (vielleicht durch ein Leerzeichen), einfache parseInt(str, 10) genug ist. parseInt überspringt führenden Whitespace.

10 ist notwendig, da sonst String wie 08 wird 0 (parseInt in den meisten Implementierungen betrachten Zahlen mit 0 als Oktal-Start) umgewandelt werden.

+3

Mit dem regulären Ausdruck '/ \ d + /' brauchen Sie nicht unbedingt 'parseInt', etwas wie '+ match.shift()' oder 'Number (match.shift()) 'ist ausreichend. Außerdem müssen Sie prüfen, ob es tatsächlich eine Übereinstimmung gibt. Die Eingabezeichenfolge darf keine Zahlen enthalten. In diesem Fall ist "Übereinstimmung" gleich "Null". – KooiInc

1

reguläre Ausdrücke verwenden:

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 
Verwandte Themen