【问题标题】:Matching last occurrence in js regex匹配 js 正则表达式中的最后一次出现
【发布时间】:2016-02-04 02:15:50
【问题描述】:

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

我有这个正则表达式:

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

但我不能,因为最后一个正则表达式只找到一次。所以我想两者都混合,可以吗?

谢谢。

【问题讨论】:

  • 您的测试用例如何反映“它正在工作”?我只看到正则表达式和 RegExr 的默认测试文本。没有匹配项。
  • 另外,你确定数字范围吗?最后一个是26+,它可以匹配 26,也可以匹配 266 或 2666666。
  • 好点 Bram Vanroy,我没有发现这个问题。
  • 我需要在我的目标号码之前、一个空格之后、数字范围之后找到最后一个日期,然后我可以什么都没有,或者我可以有其他不具体的东西,在我的目标号码之后。
  • 我的问题是在我的目标号码之前,我可以有更多的号码,也可以没有,像这样:regexr.com/3cnhf,我有两个 02521。

标签: javascript regex


【解决方案1】:

我注意到您的文本可能包含您的初始正则表达式模式无法覆盖的片段。
这些是18/07/2011 I1 0410112/07/2011 I1 02410 9.501,6015/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

【讨论】:

    【解决方案2】:

    一种方法包括分隔每条记录(这很容易,因为它们用空格分隔,每条记录都以日期开头,后跟空格、数字 (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)
    

    然后你就可以对选中的记录做你想做的事了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多