Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取字符串中第一个数字的索引_Javascript_Regex - Fatal编程技术网

Javascript 如何获取字符串中第一个数字的索引

Javascript 如何获取字符串中第一个数字的索引,javascript,regex,Javascript,Regex,我需要找出如何获得字符串中第一个数字的索引。我有一个想法,如何做到这一点,使用一些循环,但这将是非常丑陋的,所以我更喜欢一些正则表达式。有人能给我一个使用正则表达式的线索吗?使用正则表达式查找索引\d firstDigit = 'Testi2ng4'.match(/\d/) // will give you the first digit in the string indexed = 'Test2ing4'.indexOf(firstDigit) 嗯,我想我需要更仔细地研究我的方法,你可以做

我需要找出如何获得字符串中第一个数字的索引。我有一个想法,如何做到这一点,使用一些循环,但这将是非常丑陋的,所以我更喜欢一些正则表达式。有人能给我一个使用正则表达式的线索吗?

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

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

嗯,我想我需要更仔细地研究我的方法,你可以做
'Testin323g'。搜索(/\d/)

搜索:[最快方式]

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

for循环比基于regex的解决方案更快:

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;
}
我又进行了一些快速测试。仍然最快:


如果您只是在寻找单行程序,您也可以尝试函数式编程方法,并可以执行以下操作:

let myStr = "ID12345";
let myStrIndex = myStr.indexOf(myStr.split('').filter(x => !isNaN(parseInt(x, 10)))[0]);
字符串被拆分为一个字符数组,而filter函数将该数组缩减为仅包含个字符的数量。新数组的第一个字符是字符串中的第一个数字字符,因此对该字符使用indexOf可以为您提供要查找的索引


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

“我知道如何使用一些循环来实现这一点,但它会非常难看,所以我更喜欢一些正则表达式。有人能给我一个使用正则表达式的线索吗?”“有趣,我认为“一些循环”比正则表达式可读性更好…好吧,我应该说高效和短于“丑陋”,但无论如何不要告诉我,带有多个if语句的循环比正则表达式的一行更好…这在很大程度上取决于正则表达式,然而,这一个是如此简单,任何其他方式似乎都很愚蠢。@Husky for循环是任何人都可读的,并且比所有作为答案提交的正则表达式都要快。是的,我有点意识到他从来没有说过他不想要0。我希望你没有选择匹配/索引的解决方案,因为它是所有解决方案中最慢的。可以说,你的第一个答案是最慢的,因为它不起作用,所以永远不会找到解决方案。不过你是对的,string.search是非常快的。既然我们谈论的是速度,那么基准测试呢:我觉得很有趣,你指出,当你的第一个解决方案比搜索慢74%时,我的是最慢的(我的慢85%)。这就像两个人在争论哪只乌龟在赛马中跑得更快。如果你想让答案被批判性地看待,也许你应该回顾一下自己的答案,你的第一个答案给了我一个答案。第二个答案是未定义的,因为str.search返回的是一个整数,而不是一个对象。既然我们谈论的是速度,那么基准测试呢:这太复杂了,甚至成本也不高。我完全支持一行程序和函数式编程,但这不是编程的目的。您应该力求简洁、易读和性能。这仍然是一个有效的答案。
let myStr = "ID12345";
let myStrIndex = myStr.indexOf(myStr.split('').filter(x => !isNaN(parseInt(x, 10)))[0]);