解决方案:
您的 RegEx 中有错字。应该是\d{5} 而不是d{5}。
其次,要删除第一个匹配的元素,您只需将数组添加到 shift 即可。 Array.prototype.shift
请务必注意,当您使用 shift 时,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(Array.prototype.filter) 的filter 方法,并通过将索引值转换为布尔值作为谓词进行过滤。这将删除第一个元素,因为0 被认为是falsy,但其余元素将被放置在一个新数组中并返回。
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)
);