2013-03-28 13 views
9

Ho bisogno di scoprire come ottenere l'indice della prima cifra in String. Ho un'idea di come farlo usando alcuni loop ma sarebbe davvero brutto quindi preferirei regex. Qualcuno potrebbe darmi un indizio su come farlo usando regex?Come ottenere l'indice della prima cifra in Stringa

+2

"hai un'idea di come farlo usando alcuni cicli ma sarebbe essere davvero brutto quindi preferirei un'espressione regolare Qualcuno potrebbe darmi un indizio su come farlo usando regex ?? " Divertente, penso che "alcuni loop" sia più leggibile quindi regex .... – Anders

+1

Ok, dovrei dire piuttosto efficiente e più breve di "brutto" ma comunque non dirmi che i loop con più se le dichiarazioni sono meglio di una linea di un'espressione regolare ... – Husky

+0

Questo dipende molto dalla regex, tuttavia questo è così semplice in qualsiasi altro modo solo sembra sciocco. – VoronoiPotato

risposta

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

Beh io che ho bisogno di guardare i miei metodi più da vicino, si può solo fare 'Testin323g'.search (/ \ d /);

+0

che dire di zero? – epascarello

+0

E dopo quella modifica, hai appena reinventato \ d – epascarello

+0

sì mi sono reso conto che non ha mai detto che non voleva 0. – VoronoiPotato

12

Cerca: [modo più veloce]

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

Partita: [Più lento di un ciclo for, solo mostrando un altro modo di farlo]

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

Trovo divertente il fatto che tu stia sottolineando che il mio è il più lento quando la tua prima soluzione è il 74% più lenta di una ricerca (il mio è più lento dell'85%). Sono come due uomini che discutono su quale tartaruga è più veloce in una corsa di cavalli. – VoronoiPotato

+0

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

+1

Se vuoi che le risposte vengano esaminate in modo critico, forse dovresti rivedere le tue, la tua prima risposta mi dà NaN su Chrome.La tua seconda risposta si rivela indefinita, perché str.search restituisce un intero non un oggetto. – VoronoiPotato

0

Un ciclo for è il più veloce di una soluzione basata su regex:

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

Provalo online!

jsbench (maggiore è meglio):

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

Se tu fossi solo alla ricerca di un uno di linea si potrebbe anche provare un approccio di programmazione funzionale e potrebbe fare qualcosa di simile al seguente:

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

La stringa è divisa in una matrice di caratteri e la funzione filtro riduce quella matrice solo ai caratteri numerici. Il primo carattere del nuovo array è il primo numero di carattere nella stringa, quindi usando indexOf su quel personaggio si ottiene l'indice che si sta cercando.

Ovviamente se nella stringa non è presente alcun carattere numerico, come risultato si ottiene un indice di -1. E potresti anche usare un controllo diverso se char è il numero funzione come parametro di .filter() - Sono sicuro che c'è qualcosa di più veloce se è una preoccupazione

Problemi correlati