23

我需要找出如何获取字符串中第一个数字的索引。我知道如何使用一些循环来做到这一点,但它真的很难看,所以我更喜欢一些正则表达式。有人可以告诉我如何使用正则表达式来做到这一点吗?

4

5 回答 5

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

好吧,我想我需要更仔细地查看我的方法,你可以这样做'Testin323g'.search(/\d/)

于 2013-03-28T13:03:46.947 回答
20

搜索:【最快的方式】

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);
于 2013-03-28T13:04:23.317 回答
9

for 循环比基于正则表达式的解决方案最快:

function indexOfFirstDigit(input) {
  let i = 0;
  for (; input[i] < '0' || input[i] > '9'; i++);
  return i == input.length ? -1 : i;
}

function indexOfNaN(input) {
  let i = 0;
  for (; input[i] >= '0' && input[i] <= '9'; i++);
  return i == input.length ? -1 : i;
}

在线尝试!

jsbench(越高越好):

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

我再次进行了一些快速测试。仍然最快:

比赛图表

自己运行吧!

于 2017-04-22T09:40:43.477 回答
4

使用string.search使用正则表达式查找索引\d

于 2013-03-28T13:03:42.173 回答
1

如果您只是在寻找一个衬里,您也可以尝试一种函数式编程方法,并且可以执行以下操作:

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

字符串被分割成一个字符数组,过滤器函数将该数组缩减为数字字符。新数组的第一个字符是字符串中的第一个数字字符,因此在该字符上使用 indexOf 可以为您提供所需的索引。

当然,如果字符串中没有数字字符,您将得到 -1 的索引。您还可以使用不同的检查 char 是否为数字函数作为 .filter() 的参数 - 如果这是一个问题,我相信会有更快的速度

于 2018-02-15T23:33:17.483 回答