javascript - 如何匹配所有 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"
并且找不到任何跳过第一场比赛的东西。
解决方案
解决方案:
您的 RegEx 中有错字。应该\d{5}
不是d{5}
。
其次,删除第一个匹配元素所需要做的就是删除shift
数组。Array.prototype.shift
请务必注意,当您使用shift
return 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
) 的方法并通过将索引值转换为布尔值作为谓词来过滤。这将删除第一个元素,因为被考虑,但其余的将被放置在一个新的数组中并返回。Array
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)
);
推荐阅读
- sql - 如何 UNNEST、GROUP 和 JOIN 一个数组?
- python-3.x - 使用 MLPClassifier 'score' 方法时出现“预期类数组,得到数组”错误
- python-3.x - 如何关注实际上是点击按钮的链接
- node.js - 如何将 vue.js 客户端添加到现有的 node.js api?
- azure-devops - 为合并 4 个不同构建工件的拉取请求发布选择正确的构建工件
- amazon-web-services - 通过 CDK 中的 ARN 将 eventSource 添加到 Lambda
- angular - 如何在嵌套表单数组中全选和取消全选?
- python - 切换到同一窗口内的弹出窗口
- php - PHP 文档 @example 示例
- c# - ASP.NET MVC - 将动态 ExpandoObject 从控制器传递到视图时出现 RuntimeBinderException