匹配js正则表达式中的最后一次出现

时间:2016-02-03 16:18:45

标签: javascript regex

我很难找到解决问题的方法:

我有这个正则表达式:

(?:\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

但我不能,因为这最后一个正则表达式只找到一次。所以我想两者兼顾,是否可能?

感谢。

2 个答案:

答案 0 :(得分:0)

我注意到您的文字可能包含初始正则表达式无法覆盖的片段。
这些片段包括18/07/2011 I1 0410112/07/2011 I1 02410 9.501,6015/07/2011 I1 02522 280,93和其他一些片段。
正如您所看到的,日期范围和所需数字之间可能存在字母数字序列(两个字符/数字)。 因此,请更改您的模式,如下所示:
为了演示,我将输出你最后一个文本的一部分(整个文本非常大)。此部分包含02410个数字的4个匹配项。

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

答案 1 :(得分:0)

一种方法是将每个记录分开(它很容易,因为它们用空格分隔,每个记录都以日期开头,后跟空格,数字(00-26)和空格:

foo(record_name(...))

然后你可以用选定的记录做你想做的事。