我正在尝试提取与员工编号相关的文件名中的所有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"
并且找不到任何跳过第一场比赛的东西。
使用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);
您的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
,其中所有内存源应被视为不可变且不变的上述解决方案,您变异数组将失败此范例。
为了避免变异数据并返回一个新数组来替换旧数据,您可以使用filter
(Array
)的Array.prototype.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)
);
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);
你可以在正则表达式匹配后使用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);
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。