2016-02-03 4 views
0

Я с трудом выяснить, решение для моей проблемы:Matching последнее вхождение в Js регулярное выражение

У меня есть это регулярное выражение:

(?:\d{2}\/\d{2}\/\d{4})\s(?:01|02|03|04|05|06|07|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26+).*?(02521)\s(?:[\d.,]+) 

И я использую его для ловли номер 02521 (я хочу знать, сколько вхождений 02521 существует), поэтому регулярное выражение ниже находит дату, а затем находит один из этих номеров:

01|02|03|04|05|06|07|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26 

Поймать все между до 02521 номера.

И это работает, как вы можете увидеть here

Но я хочу, чтобы сделать его более безопасным, и дата является проблемой, потому что я хочу, чтобы найти последнюю дату перед номером, более или менее, как this

Но я не могу, потому что это последнее регулярное выражение находит только одно вхождение. Поэтому я хотел бы смешивать оба варианта, возможно ли это?

Спасибо.

+0

Как ваш тестовый пример отражает то, что «он работает»? Я вижу только регулярное выражение и тестовый текст RegExr по умолчанию. Нет совпадений. –

+0

Кроме того, вы уверены, что диапазон цифр? Последний из них - «26 +», который соответствовал бы 26, но также 266 или 2666666. –

+0

Хороший момент Брэм Ванрой, я не поймал эту проблему. –

ответ

0

Я заметил, что ваш текст может иметь фрагменты, которые не могут быть покрыты вашим исходным шаблоном регулярного выражения.
Это 18/07/2011 I1 04101, 12/07/2011 I1 02410 9.501,60, 15/07/2011 I1 02522 280,93 и некоторые другие.
Как вы можете видеть, между диапазоном дат и нужным номером может быть алфавитно-цифровая последовательность (два символа/цифры). Итак, измените свой рисунок, как будет показано ниже:
Для демонстрации я выведу только часть вашего последнего текста (весь текст довольно большой). Эта часть содержит 4 совпадения номера 02410.

var text = "AUGUSTO PERES FILHO 180.87386.99-5 23/10/2006 01 02410 6.488,00 0,00 0,00 406,09 0,00 0,00 ANTONIO CARLOS BAGNATORI FERNANDES 124.79898.68-9 19/08/2008 01 02522 4.730,15 0,00 0,00 406,09 0,00 0,00 ANTONIO VALDECIR ROSSI 106.37070.87-6 03/01/2005 01 04101 7.003,00 3.450,50 0,00 406,09 0,00 0,00 ANUBIA MARIA DE OLIVEIRA RODRIGUES 123.88469.32-7 03/11/2010 01 03548 3.078,53 0,00 0,00 338,63 0,00 0,00 ARAI DE OLIVEIRA RODRIGUES 207.26620.55-0 28/11/2006 01 03548 2.331,09 0,00 0,00 256,41 0,00 0,00 ARIANE ANGELO DA SILVA 135.67665.77-3 09/02/2011 01 04223 1.349,00 0,00 0,00 121,41 0,00 0,00 AUDREY DOS SANTOS 200.30943.45-5 21/12/2009 01 04110 1.935,00 0,00 0,00 212,85 0,00 0,00 BARBARA CRISTINA PEREIRA ASSUNCAO MAIORI 132.48719.81-7 03/05/2010 01 02524 2.255,91 0,00 0,00 248,15 0,00 0,00 BIANCA DA COSTA SANTOS 207.86622.17-7 01/12/2010 01 04110 1.636,68 0,00 0,00 147,30 0,00 0,00 BRUNA ALINE MORIBE 132.04120.89-8 16/02/2009 01 02410 3.421,00 0,00 0,00 376,31 0,00 0,00 BRUNA D ANDREA 133.71271.77-2 08/05/2008 01 04110 1.870,00 0,00 0,00 205,70 0,00 0,00 ,MINISTÉRIO DO TRABALHO E EMPREGO - MTE MINISTÉRIO DA FAZENDA - MF DATA: 22/01/2016 GFIP - SEFIP 8.40 (22/03/2012) TABELAS 31.0 (25/01/2012) HORA: 18:42:37 PÁG : 0004/0034 RELAÇÃO DOS TRABALHADORES CONSTANTES NO ARQUIVO SEFIP MODALIDADE : 9-CONFIRMAÇÃO INFORMAÇÕES ANTERIORES - REC/DECL AO FGTS E DECL À PREVIDÊNCIA EMPRESA: CVC BRASIL OPERADORA E AGENCIA DE VIAGEN INSCRIÇÃO: 10.760.260/0001-19 COMP: 07/2011 COD REC:115 COD GPS: 2100 FPAS: 515 OUTRAS ENT: 0115 SIMPLES: 1 RAT: 1.0 FAP: 0.50 RAT AJUSTADO: 0.50 TOMADOR/OBRA: INSCRIÇÃO: NOME TRABALHADOR PIS/PASEP/CI ADMISSÃO CAT OCOR DATA/COD MOVIMENTAÇÃO CBO REM SEM 13º SAL REM 13ºSAL BASE CÁL 13ºSAL PREV SOC CONTRIB SEG DEVIDA DEPÓSITO JAM BASE CÁL PREV SOCIAL BRUNA MARQUES 133.08610.89-1 01/09/2010 01 01/07/2011 J 04110 410,79 619,46 619,46 82,41 0,00 0,00 BRUNO ALTINO SANTANA DOS SANTOS 161.17769.57-2 03/02/2011 01 04223 1.412,26 0,00 0,00 127,10 0,00 0,00 BRUNO ROSOLEM DOS SANTOS 131.85360.89-2 01/04/2008 01 02410 2.140,00 12/07/2011 I1 02410 9.501,60"; 

var matches = text.match(/\s(?:\d{2}\/\d{2}\/\d{4})\s(?:[a-zA-Z0-9]{2})(?:[\d\s\w.,]+)?\s(02410)\s(?:[\d.,]+)/gim); 
console.log(matches.length); 
// the output: 4 

https://jsfiddle.net/jfqf4vb5/

А вот реальный пример с исходным текстом:
http://regexr.com/3cnia

0

подход состоит отделить друг записи (это легко, так как они разделены пробелом, и каждый начинается с даты, за которой следует пробел, номер (00-26) и пробел:

var results = data 
    .split(/ (?=[0-9]{2}\/[0-9]{2}\/[0-9]{4} (?:[01][0-9]|2[0-6]))/) 
    .filter(function (record) { 
     return record.indexOf(' 02521 ', 13) > 0; 
    }); // index after the 00-26 number--^ 

console.log(results) 

Затем вы можете делать то, что хотите, с выбранными записями.

Смежные вопросы