Как получить индекс первой цифры в String

Мне нужно выяснить, как получить индекс первой цифры в String. У меня есть идея, как это сделать, используя некоторые циклы, но это было бы очень уродливо, поэтому я предпочел бы некоторое регулярное выражение. Может ли кто-нибудь дать мне понять, как это сделать с помощью регулярного выражения?

Ответ 1

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

Ну, я думаю, мне нужно посмотреть на мои методы более внимательно, вы можете просто сделать 'Testin323g'.search(/\d/);

Ответ 2

Поиск: [Самый быстрый способ]

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);

Ответ 3

Используйте string.search, чтобы найти индекс с регулярным выражением \d

Ответ 4

Цикл for быстрее, чем решение на основе регулярных выражений:

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

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
indexOfFirstDigit        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)

Ответ 5

Если вы просто искали один лайнер, вы также можете попробовать подход к функциональному программированию и могли бы сделать что-то вроде следующего:

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

Строка разделяется на массив символов, а функция фильтра уменьшает этот массив до числа символов. Первый символ нового массива - это первый номер символа в строке, поэтому с помощью indexOf на этом символе вы получаете индекс, который вы ищете.

Конечно, если в строке нет символа номера, в результате вы получите индекс -1. И вы также можете использовать другую проверку, если char является числовой функцией в качестве параметра .filter() - я уверен, что есть что-то более быстрое, если это беспокойство