Решение:
У вас была опечатка в вашем 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);
В качестве альтернативы:
Функция A:
Если вы обнаружите, что это то, что вы собираетесь делать довольно часто, возможно, в ваших интересах создать функцию, которая будет выполнять это действие за вас. В этом случае было бы лучше использовать что-то вроде этого:
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
метод *1059* ( 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)
);