2013-03-28 135 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() - 我相信有更快的事情,如果这是一个问题

相关问题