如何匹配所有5位数字,但跳过第一个匹配项

时间:2019-04-22 23:35:17

标签: javascript arrays regex string

我正在尝试提取与员工编号相关的文件名中的所有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",却找不到第一场比赛跳过的任何东西。

4 个答案:

答案 0 :(得分:3)

解决方案:

您在RegEx中输入了错误。应该是\d{5}而不是d{5}

第二个要做的就是删除第一个匹配的元素是shift数组。 Array.prototype.shift

请务必注意,当您使用shift时,返回的shift将是被删除的元素,而不是不是新数组或更改过的数组。这就是为什么必须将变量分配给原始Array的原因,并且分配后在数组上完成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来替换旧的Array,可以使用filterArray.prototype.filter)的Array方法并通过将索引值转换为布尔值作为谓词。这将删除第一个元素,因为0被认为是falsy,但是其余元素将被放置在新的Array中并返回。

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

答案 1 :(得分:2)

How to match on all 5 digit numbers but skip the first match

这是一种方式:

var str = "01_12345_02_02_2019_12347_67890_10112_13141";
var empRegex = /(?:^.*?\d{5}.*?)?(\d{5})/g;
var empNumbers = [];
var item;

while (item = empRegex.exec( str ))
    empNumbers.push(item[1]);

// ---------
console.log(empNumbers);

答案 2 :(得分:1)

您可以在正则表达式匹配后使用array.slice

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


如果您知道此字符串的格式永远不变,另一种方法是完全不使用正则表达式

var str = "01_12345_02_02_2019_12347_67890_10112_13141";
var empNumbers = str.split('_').slice(-4).toString();
console.log(empNumbers);

  

有些人遇到问题时会认为“我知道,我会使用正则表达式”。现在他们有两个问题。

Coding Horror's blog

答案 3 :(得分:1)

使用shift()

 

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