首页 > 解决方案 > 如何匹配所有 5 位数字但跳过第一个匹配

问题描述

我正在尝试提取与员工编号有关的文件名中的所有 5 位数字。我遇到的问题是文件名中的前 5 位数字与作业编号有关。我需要跳过第一场比赛,然后继续比赛并匹配所有 5 位数字

var str = "01_12345_02_02_2019_12347_67890_10112_13141";
var empRegex = /(\d{5})/g;
var empNumbers;
empNumbers = str.match(empRegex).toString();
console.log(empNumbers);

我需要"12347, 67890, 10112, 13141"

我得到"12345, 12347, 67890, 10112, 13141"并且找不到任何跳过第一场比赛的东西。

标签: javascriptarraysregexstring

解决方案


解决方案:

您的 RegEx 中有错字。应该\d{5}不是d{5}

其次,删除第一个匹配元素所需要做的就是删除shift数组。Array.prototype.shift

请务必注意,当您使用shiftreturn of时,shift将是被删除的元素,而不是新的或更改的数组。这就是为什么您必须将变量分配给原始数组,并shift在分配后在数组上完成该方法。

简单地说,你必须这样做:

(empNumbers = str.match(empRegex)).shift(); 

不是这个:

 empNumbers = str.match(empRegex).shift();

由于shift将就地更改数组,因此您最终得到的是array减去第一个匹配的元素。

代码片段:

var str = "01_12345_02_02_2019_12347_67890_10112_13141";
var empRegex = /(\d{5})/g;
var empNumbers;
(empNumbers = str.match(empRegex)).shift();
console.log(empNumbers);


或者:

一个功能:

如果您发现这是您经常要做的事情,那么创建一个将为您执行此操作的函数可能符合您的最佳利益。在这种情况下,最好使用这样的东西:

var str = "01_12345_02_02_2019_12347_67890_10112_13141", empRegex = /(\d{5})/g;

function matchExceptFirst(str, RE) {
let matches = str.match(RE); 
matches.shift();
return matches;
}

var empnumbers = matchExceptFirst(str, empRegex);
console.log(empnumbers);

纯函数式方法:

还值得指出的是,如果您希望使用Functional Paradigm其中所有内存源都应被视为不可变且不更改的上述解决方案,那么您对 ​​Array 进行变异的解决方案将失败此范例。

为了避免改变数据并返回一个新数组来替换旧数组,您可以使用( Array.prototype.filterfilter ) 的方法并通过将索引值转换为布尔值作为谓词来过滤。这将删除第一个元素,因为被考虑,但其余的将被放置在一个新的数组中并返回。Array0falsy

   let excludeFirstMatch = (str, re) => str.match(re).filter((_,i) => (i));

    var str = "01_12345_02_02_2019_12347_67890_10112_13141", empRegex = /(\d{5})/g;
   
   
   let excludeFirstMatch = (str, re) => str.match(re).filter((_,i) => (i));
    

   console.log( 
   excludeFirstMatch(str, empRegex) 
   );


编辑:正如@UlysseBN 指出的那样,您也可以使用slice,它更快并且还返回一个新数组。

var str = "01_12345_02_02_2019_12347_67890_10112_13141", empRegex = /(\d{5})/g;
   
   
   let excludeFirstMatch = (str, re, len = str.length) => str.match(re).slice(1, len);
    

   console.log( 
   excludeFirstMatch(str, empRegex) 
   );


推荐阅读