我需要找出如何获取String中第一个数字的索引。我知道如何使用一些循环,但它会非常难看所以我更喜欢一些正则表达式。有人能告诉我如何使用正则表达式做到这一点吗?
答案 0 :(得分:17)
搜索: [最快的方式]
var str = "asdf1";
var search = str.search(/\d/)
console.log(search);
匹配: [比for循环慢,只是显示另一种方式]
var str = "asdf1";
var match = str.match(/(\D+)?\d/)
var index = match ? match[0].length-1 : -1;
console.log(index);
答案 1 :(得分:9)
firstDigit = 'Testi2ng4'.match(/\d/) // will give you the first digit in the string
indexed = 'Test2ing4'.indexOf(firstDigit)
嗯,我想我需要更仔细地研究一下我的方法,你可以做'Testin323g'.search(/\d/)
;
答案 2 :(得分:4)
使用string.search查找带有正则表达式\d
答案 3 :(得分:0)
for循环比基于正则表达式的解决方案更快:
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)
答案 4 :(得分:0)
如果您只是在寻找一个内衬,您还可以尝试使用函数式编程方法,并且可以执行以下操作:
let myStr = "ID12345";
let myStrIndex = myStr.indexOf(myStr.split('').filter(x => !isNaN(parseInt(x, 10)))[0]);
字符串被拆分为一个字符数组,过滤器函数将该数组简化为数字字符。新数组的第一个字符是字符串中的第一个数字字符,因此在该字符上使用indexOf可以为您提供所需的索引。
当然,如果字符串中没有数字字符,那么结果将得到-1的索引。你也可以使用一个不同的检查,如果char是数字函数作为.filter()的参数 - 我确信如果这是一个关注的话会有更快的东西