2013-03-28 185 views
9

我需要了解如何獲取字符串中第一個數字的索引。我有一個想法如何使用一些循環,但它會非常醜陋,所以我寧願一些正則表達式。有人可以給我一個線索如何使用正則表達式來做到這一點?如何獲得字符串中第一個數字的索引

+2

「有一個想法如何做到這一點使用一些循環,但它會真的很醜,所以我更喜歡一些正則表達式。有人可以給我一個線索如何使用正則表達式??「 有趣的是,我認爲「一些循環」更容易閱讀正則表達式.... – Anders

+1

好吧,我應該說有效率和短於「醜陋」,但無論如何不要告訴我,幾個if語句循環比一個正則表達式的行... – Husky

+0

這非常依賴於正則表達式,但是這個非常簡單,任何其他方式看起來都很愚蠢。 – VoronoiPotato

回答

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

嗯,我想我需要在我的方法更緊密地看,你可以做「Testin323g'.search(/ \ d /);

+0

什麼是零? – epascarello

+0

然後編輯,你剛剛重新創建\ d – epascarello

+0

是的,我有點意識到他從來沒有說過他不想要0. – VoronoiPotato

12

搜索: [最快的方法]

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

比賽: [比for循環慢,只是顯示這樣做的另一種方式] for循環是最快的

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

我發現它很有趣,你指出我的速度最慢時,你的第一個解決方案比搜索速度慢了74%(我的速度慢了85%)。這就像兩個人爭論在賽馬中哪隻烏龜比較快。 – VoronoiPotato

+0

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

+1

如果你想要批判性地看待答案,也許你應該檢討一下自己的答案,你的第一個答案就是給我鍍鉻的NaN。你的第二個答案產生未定義,因爲str.search返回一個整數而不是一個對象。 – VoronoiPotato

0

一比基於正則表達式的解決方案:

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

在線試用!

jsbench(越高越好):

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

如果你只是尋找一個襯墊,你也可以嘗試一種函數式編程方法,並可以做類似如下:

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

該字符串被分割成一個字符數組,過濾函數將該數組縮減爲數字字符。新數組的第一個字符是字符串中的第一個數字字符,因此在該字符上使用indexOf會爲您提供您正在查找的索引。

當然,如果字符串中沒有數字字符,您將得到-1的索引。你也可以使用不同的檢查,如果字符是數字函數作爲參數.filter() - 我相信有更快的事情,如果這是一個問題

相關問題