2013-03-28 6 views
9

Ich muss herausfinden, wie man den Index der ersten Ziffer in String erhalten. Ich habe eine Idee, wie man das mit einigen Loops macht, aber es wäre wirklich hässlich, also würde ich etwas Regex bevorzugen. Könnte mir jemand einen Hinweis geben, wie man das mit Regex macht?Wie bekomme ich Index der ersten Ziffer in String

+2

"habe eine Idee, wie man das mit einigen Schleifen, aber es würde Sei wirklich hässlich, also würde ich etwas Regex bevorzugen. Könnte mir jemand einen Hinweis geben, wie man das mit Regex macht? " Lustig, ich denke, "einige Schleifen" ist lesbarer als Regex .... – Anders

+1

Ok, ich hätte eher effizient gesagt und kürzer als "hässlich" aber trotzdem nicht sagen, dass Schleifen mit mehreren if-Anweisungen besser als eins sind Zeile eines Regex-Ausdrucks ... – Husky

+0

Das hängt sehr von der Regex ab, aber diese ist so einfach, dass jede andere Art nur albern erscheint. – VoronoiPotato

Antwort

3
firstDigit = 'Testi2ng4'.match(/\d/) will give you the first digit in the string 
indexed = 'Test2ing4'.indexOf(firstDigit) 

Nun, ich ich meine Methoden genauer hinsehen müssen erraten finden, kann man einfach Testin323g'.search tun‘(/ \ d /);

+0

Was ist mit Null? – epascarello

+0

Und nach diesem Schnitt haben Sie gerade neu erfunden \ d – epascarello

+0

yeah Ich erkannte irgendwie, dass er nie gesagt hat, dass er nicht 0 wollte. – VoronoiPotato

12

Suche: [schnellster Weg]

var str = "asdf1"; 
var search = str.search(/\d/) 
console.log(search); 

Spiel: [Langsamer als ein for-Schleife, zeigt nur eine andere Art und Weise tun]

var str = "asdf1"; 
var match = str.match(/(\D+)?\d/) 
var index = match ? match[0].length-1 : -1; 
console.log(index); 
+1

Ich finde es amüsant, dass Sie darauf hinweisen, dass meins am langsamsten ist, wenn Ihre erste Lösung 74% langsamer ist als eine Suche (meine ist 85% langsamer). Es ist wie zwei Männer, die darüber streiten, welche Schildkröte in einem Pferderennen schneller ist. – VoronoiPotato

+0

http://jsperf.com/indexof-vs-searches – VoronoiPotato

+1

Wenn Sie möchten, dass Antworten kritisch betrachtet werden, sollten Sie vielleicht Ihre eigenen überprüfen, Ihre erste Antwort gibt mir NaN auf Chrom.Ihre zweite Antwort liefert undefined, weil str.search eine Ganzzahl und kein Objekt zurückgibt. – VoronoiPotato

0

Eine for-Schleife am schnellsten als eine auf Regex basierende Lösung:

function indexOfNaN(input) { 
    let i = 0; 
    for (; input[i] >= '0' && input[i] <= '9'; i++); 
    return i; 
} 

Probieren Sie es online aus!

jsbench (je höher desto besser):

TestCase results for your browser Firefox version 54.0 
Test name    Benchmark results 
indexOfNan    11,175,400 (±2.77) 
regex search    3,787,617 (±5.22) 
regex match    2,157,958 (±6.49) 
regex match + indexOf 1,131,094 (±4.63) 
0

Wenn Sie nur wurden für einen Einzeiler suchen, könnte man auch einen funktionalen Programmierung Ansatz versuchen und so etwas wie das folgende tun könnte:

let myStr = "ID12345"; 
let myStrIndex = myStr.indexOf(myStr.split('').filter(x => !isNaN(parseInt(x, 10)))[0]); 

Die Zeichenfolge wird in ein Array von Zeichen aufgeteilt, und die Filterfunktion reduziert dieses Array auf die Anzahl der Zeichen. Das erste Zeichen des neuen Arrays ist das erste Zahlenzeichen in der Zeichenfolge. Daher gibt indexOf für dieses Zeichen den Index, nach dem Sie suchen.

Natürlich, wenn es kein Zahlenzeichen in der Zeichenfolge gibt, erhalten Sie als Ergebnis einen Index von -1. Und Sie könnten auch eine andere Überprüfung verwenden, wenn char Nummer Funktion ist als Parameter zu .filter() - Ich bin mir sicher, dass es etwas schneller ist, wenn das ein Anliegen ist

Verwandte Themen