Как сопоставить все 5-значные числа, но пропустить первое совпадение - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь извлечь все 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 ]

3 голосов
/ 23 апреля 2019

Решение:

У вас была опечатка в вашем 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) 
   );
2 голосов
/ 23 апреля 2019

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);
1 голос
/ 23 апреля 2019

Использование 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);
1 голос
/ 23 апреля 2019

Вы можете использовать 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);

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы.

Кодирование блога ужаса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...