当第一个值是可选的时,如何捕获第二个值

时间:2016-01-14 18:27:10

标签: javascript regex

我很难弄清楚如何制作完美的正则表达式,这将完全符合我的要求。

我有一段巨大的文字:

...Total Geral 1 Salário mensal [ 945] 25.732,00 1.822.314,85 501 Faltas [ 3] 6,00 164,18 4 Difer de salário [ 2] 684,40 502 Atrasos / Faltas [ 7] 26,97 177,88 5 Doença prim 15 d [ 2] 20,00 975,17 511 INSS normal [ 941] 205.481,30 10 Pró labore [ 1] 12.336,00 513 INSS 13º quit [ 25] 2,10 1.910,23 18 Comissão [ 361] 422.056,09 514 Prov INSS férias [ 75] 17.391,24 19 Dsr/Com. [ 361] 105.513,98 521 Imp renda normal [ 316] 76.618,02 20 Dif. Comissão [ 1] 391,85 522 Imp renda férias [ 15] 10.612,15 21 Dif.DSR Comissao [ 1] 58,05 525 IRRF 13º quit [ 4] 900,54 27 Hora extra 50% [ 26] 235,41 2.701,64 527 Imp renda adiant [ 459] 90.027,88 35 DSR S/ HE [ 26] 675,28 532 Adiant quinzenal [ 814] 599.405,07 43 Ad. de Anuênio [ 417] 2.386,00 35.025,07 534 Antecip 13º quit [ 1] 502,10 51 Bônus [ 2] 2.479,17 545 Amil Dental [ 423] 668,00 9.020,30 64 Auxílio creche [ 45] 47,00 6.315,00 561 Vale transporte [ 452] 41.887,75 69 DIF. AUX. CRECHE [ 48] 1.735,80 562 Refeição [ 23] 2.847,00 70 Salário Maternid [ 15] 407,00 21.915,93 567 Seguro de vida [ 963] 963,00 481,50 95 Insufic de saldo [ 17] 29.956,56 568 Farmácia [ 146] 13.961,27 201 Férias básico [ 75] 1.475,00 111.691,37 580 Seg.Porto Seguro [ 19] 498,72 202 Férias bás 1/3 [ 75] 37.230,47 588 Amil Assist. Méd [ 270] 454,00 25.295,42 203 Ab pecun básico [ 61] 580,00 43.892,95 591 VT Não Devolvido [ 11] 1.915,16 204 Ab pecun bás 1/3 [ 61] 14.631,01 593 Golden Farma [ 47] 3.709,55 205 Férias médias [ 45] 33.043,51 594 Amil Co-Particip [ 320] 6.146,00 206 Férias méd 1/3 [ 44] 11.014,53 595 Amil Resgate [ 20] 31,00 248,00 207 Ab pecun médias [ 36] 14.505,25 601 Pens alim normal [ 11] 9.895,68 208 Ab penun méd 1/3 [ 36] 4.835,09 706 Líquido férias [ 76] 281.095,94 221 Df férias básico [ 3] 1.285,18 707 Líquido rescisão [ 27] 146.976,86 222 Dif fér bás 1/3 [ 3] 428,39 708 Saldo ng mês ant [ 27] 30.813,03 223 Df abono fér bás [ 2] 521,00 2080 AD. DIF. SAL. [ 3] 5.131,97 224 Df abono bás 1/3 [ 2] 173,66 2096 Liquido Rescisão [ 1] 15.855,11 225 Dif férias méd [ 35] 2.954,33 2527 Promoçao [ 59] 202,00 1.431,00 226 Dif fér méd 1/3 [ 35] 984,76 2533 Promoção Páscoa [ 23] 1.039,49 227 Df abono fér méd [ 30] 1.283,15 3064 Empr Cons Alfa [ 59] 13.157,40 228 Df abono méd 1/3 [ 30] 427,74 3065 Empr Cons Caixa [ 146] 162,00 55.561,46 303 13º sal 1ª p bás [ 22] 125,50 31.444,66 3076 INSS Pró-Labore [ 1] 375,81 304 13º sal 1ª p med [ 7] 2.325,54 3098 Dv Sal Pg Maior [ 1] 1,00 54,93 401 Aviso previo ind [ 14] 420,00 29.506,00 3601 IR Fér Rc Mês [ 45] 11.385,85 402 Av prév ind méd [ 11] 14.995,33 5004 Dif. Apur.de Co [ 32] 6.363,76 411 13º sal quit bás [ 25] 80,00 10.933,92 412 13º sal quit méd [ 19] 9.743,14 413 13º qui avis bás [ 14] 14,00 2.458,84 414 13º qui avis méd [ 11] 11,00 2.169,99 421 Férias ind bás [ 10] 330,00 18.270,00 422 Fér ind bás 1/3 [ 10] 6.089,96 423 Férias ind méd [ 8] 13.753,71 424 Fér ind méd 1/3 [ 8] 4.584,54 431 Férias prop bás [ 22] 132,00 20.495,91 432 Fér prop bás 1/3 [ 22] 6.831,95 433 Férias prop méd [ 17] 106,00 10.273,28 434 Fér prop méd 1/3 [ 17] 3.424,36 445 Inden resc antec [ 1] 1,00 29,03 448 Dev.Desc. Indev. [ 5] 2.032,09 450 Ind Art 477 CLT [ 5] 8.580,00 2256 Dv INSS Normal [ 4] 102,39 2258 Av Pr Especial [ 4] 127,00 8.048,27 2259 Av Pr Espec Md [ 4] 127,00 7.980,23 2273 Ins Lq Demitidos [ 1] 187,64 2275 Md Lic. Mat [ 8] 228,00 13.517,97 2277 Anuênio Lic. Mat [ 10] 259,00 733,86 4010 Comissão Bilhet [ 224] 9.084,84 4011 Dsr/Com.Bilhetes [ 224] 2.271,21 5020 Bolsa Auxílio [ 17] 1.964,91 12.694,01 Total de Vencimentos: 2.996.599,90 Total de Descontos: 1.688.339,55 Líquido Pago: 1.308.260,35 801 Despesas VT [ 454] 83.194,75 1011 Vl FGTS 13º sal [ 47] 4.685,80 802 FGTS mês resc [ 15] 6.252,43 1012 Base IRRF normal [ 975] 1.580.993,03 803 FGTS 13º s resc [ 15] 1.585,98 1013 Rendimento bruto [ 975] 2.468.519,28 805 FGTS 40% resc [ 15] 62.708,42 1014 Últ remuneração [ 987] 2.087.529,50 817 Bs FGTS fer mês [ 107] 199.320,84 1016 Bs INSS férias [ 107] 148.077,08 830 Bs INSS norm neg [ 1] 54,93 1017 Bs INSS fér exce [ 45] 51.243,76 832 Bs FGTS norm neg [ 1] 54,93 1018 Bs IRRF 13º sal [ 25] 22.792,90 901 Vale transp forn [ 454] 10.198,00 80.354,43 1023 Dep IRRF normal [ 205] 338,00 50.933,22 907 Sbs Vale-Transp [ 372] 39.771,09 1024 Dep IRRF férias [ 5] 6,00 904,14 915 Adto. VT [ 22] 1.006,00 5.091,71 1025 Dep IRRF 13º sal [ 5] 6,00 904,14 950 Seg.Vid.Empresa [ 19] 498,72 1029 Acr 40% FGTS 10% [ 15] 15.677,16 951 SV-FUNCIONÁRIOS [ 981] 981,00 4.394,07 1031 Bs INSS fér mês [ 107] 199.320,84 952 Assis.Méd.Empr. [ 830] 197.144,86 1032 B INSS fér p mês [ 38] 38.581,52 953 Cust.Tot.Ass.Méd [ 830] 171.849,44 1040 Sl Base Resc/Fér [ 101] 209.209,00 954 SV 100.000,00 [ 19] 19,00 748,79 1608 Remuneração base [ 987] 2.087.529,50 955 SV 50.000,00 [ 61] 61,00 1.201,70 1706 Base FGTS Seg/Ex [ 3] 64,00 2.742,13 956 SV 200.000,00 [ 1] 1,00 113,87 2601 CINEMARK [ 59] 202,00 1.431,00 958 SV 300.000,00 [ 7] 7,00 827,54 2603 Vale transporte [ 452] 43.802,91 1001 B INSS 13º salár [ 25] 20.550,97 5052 Metas Comissão [ 353] 203.404.423,58 Referência: 1405 - Folha de Pagamento por Folha Página: 181 , Gerado por ap_psimplicio Folha de Pagamento 30/04/2010 Sintético - Mensal 17:21:02 FOLHA DE PAGAMENTO Ref.: ABRIL/2010 1002 B INSS 13º exced [ 1] 126,09 5053 Vendas P. Física [ 348] 148.847.271,84 1003 Base FGTS férias [ 107] 199.320,84 5056 T. Restaurante [ 931] 18.833,00 243.847,01 1004 Val FGTS férias [ 107] 15.945,70 5058 V. Corporativas [ 27] 1.670.279,93 1005 Base FGTS normal [ 959] 2.503.329,26 5064 Vendas Bilhetes [ 225] 1.644.261,75 1006 Val FGTS normal [ 959] 200.264,15 5093 Vendas P. F Brut [ 349] 162.735.155,24 1007 Bs INSS até teto [ 958] 1.964.505,58 5127 Tot INSS Fér RcM [ 75] 17.391,24 1008 Bs INSS nor exce [ 238] 487.887,72 5129 Tot IR FR Pg MAt [ 45] 11.385,85 1009 Bs IRRF férias [ 56] 84.761,54 1010 Base FGTS 13º s [ 47] 58.573,99 Quantidade por Situação: [1-Ativo=900] [3-Demitido em Meses Anteriores=2] [3-Demitido no Mês=26] [5-Em Maternidade=12] [6-Acidente do Trabalho=2] [7-Auxílio-Doença=6] [9-Férias=39] [17-Pré-Auxílio-Doença=1] [Total=988] Referência: 1405 - Folha de Pagamento por Folha Página: 182 

在其中,我有几个表,如:

1 Salario mensal    [ 945] 25.732,00 1.822.314,85
4 Difer de salário  [   2]                 684,40

我尝试创建一个我只需要传递左值的正则表达式,正则表达式将返回最正确的值,在这些情况下,1.822.314,85684,40

问题是:有时候我没有中等价值。

到目前为止,我有这个:

Total\sGeral.*?\s(?:27)\s.*?\[\s\d+]

DEMO

我能够捕捉到[ digit],但如果只有一个值,我就不知道如何捕获下一个值,如果有两个值,则不知道如何捕获第二个值。< / p>

你们能帮我一把吗?

更新 -

其他担心的是数字,有时这个文档没有最合适的值,所以为了避免匹配我使用\s(?:THE NUMBER HERE)\s的错误内容,也许有更好的东西?< / p>

2 个答案:

答案 0 :(得分:0)

您可以尝试这一点,它似乎与每个部分中的最后一个值相匹配 最后一个值位于捕获组1中。

\] \s+ # Bracket followed by whitespaces (?: \d [.\d]* , \d+ \s+ )* # Optional values ( \d [.\d]* , \d+ ) # (1), The last value

格式化

Function GetGeoData(sSearch as String) as String
   If Len(sSearch) = 0 Then Exit Function 'we dont need empty cells <img draggable="false" class="emoji" alt="" src="http://s.w.org/images/core/emoji/72x72/1f609.png">
   URL = "http://maps.googleapis.com/maps/api/geocode/xml?sensor=true&address="  'we will use the google maps api
   URL = URL & sSearch          'create the searchstring
   oSimpleFileAccess = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) 'this is the Sefvice in getting the data from the web
   On Error GoTo ErrorResponse
   oInputStream = oSimpleFileAccess.openFileRead(URL) 'use the URL
   oTextStream = createUnoService("com.sun.star.io.TextInputStream") 'get the data from the web
   oTextStream.InputStream = oInputStream 'this is the data
   aDelimiters = Array(ASC(">"),ASC("<")) 'as the stream is segmented with ">" and "<"
   sLastString = ""
   Do While NOT oTextStream.isEOF 'go through the google output
      sThisString = oTextStream.readString(aDelimiters,True) 
      Select Case sLastString 'now search for the entries
         Case "lat": 'latitudes
            sLat = sThisString  
            Case "lng": 'longitude
            sLon = sThisString
      End Select
      sLastString = sThisString
   Loop
   GetGeoData =  " Longitude: " & sLon & " Latitude: " &sLat 'this is our output in  the new cell
   oInputStream.closeInput()
   Exit Function
   ErrorResponse:
   GetGeoData = "no values found!!!"
End Function

答案 1 :(得分:0)

我认为这就是你要找的东西:

\s+(?:27)\s+[^\]\[]+\[\s*\d+\](?:\s+((?:\d+\.)*\d+,\d+))+

DEMO

((?:\d+\.)*\d+,\d+)匹配货币金额并在第1组中捕获。

(?:\s+((?:\d+\.)*\d+,\d+))+匹配一个或多个货币金额,但只有捕获最后一个货币金额。

但事实证明\s+(?:27)\s+不是匹配记录号的可靠方法。例如,如果您搜索记录15(不存在),您将获得此记录:

 5 Doença prim 15 d [ 2] 20,00 975,17

我没有看到匹配记录编号的防弹方法,但是如果你把它添加到开头:

\b(?:Total Geral|\d+)

...它似乎对您提供的示例正常工作。 (DEMO