Ir para conteúdo
altyouth

Expressões Regulares

Recommended Posts

Tenho um código que le um arquivo csv e tenho expressões regulares pra encontrar determinados trechos. Pois bem, o código capta a maioria, mas tem alguns que nao são capturados 

msm seguindo a mesma regra das outras. 

 

O codigo esta em Scala

 

formato do arquivo csv:

 

Relatório de Controle de Ponto (por período);;;;;;;;;;;;;;;;;;;;;;;;;;;
;Empregador:;;;;CASTAWARE SOLUTIONS INC.;;;;;;;;;;;;CNPJ:;;;;;;1234567890;;;;
;Endereço:;;;;CastaStreet, 1234 - Hawai;;;;;;;;;;;;Unidade:;;;;;;;;;;
;Período:;;;;;01/09/2019;;;a;;14/09/2019;;;;;;Emitido em:;;;;;;14/setembro/2019;;;;
;Matrícula:;;;;1;;;;;;;;;;;;Admissão:;;;;;;01/junho/2016;;;;
;Escala atual:;;;;08:00 Livres Almoço Flex Seg---- / Sáb-Dom Repouso;;;;;;;;;;;;Demissão:;;;;;;;;;;
;Cargo:;;;;;;;;;;;;Função:;;;;;;;;;;;;;;
;Empregado:;;;;Roberto Gomes Soares;;;;;;;;;;;;;;;;;;;;;;
Dia;;;"Jornada realizada
ENTR. SAIDA ENTR. SAIDA";;;;;;; Turno;;;Jornada Diurna/Not.;;"Extra
Diurno/Not.";;;;;;Devido;Abono;;Desab;;; Justificativa
01/09 - dom;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
02/09 - seg;;;10:25 12:34 13:35 18:28;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;07:02;00:00;00:00;;;00:00;;;00:58;;;;;;
03/09 - ter;;;09:18 12:04 13:23 19:33;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:00;00:00;00:56;;;00:00;;;00:00;;;;;;
04/09 - qua;;;09:37 11:16 11:56 18:51;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:34;00:00;00:00;;;00:00;;;00:00;;;;;;
05/09 - qui;;;09:47 12:18 13:15 18:16;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;07:32;00:00;00:00;;;00:00;;;00:00;;;;;;
06/09 - ---;;;08:54 11:13 11:58 16:12;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;06:33;00:00;00:00;;;00:00;;;01:27;;;;;;
07/09 - sáb;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
08/09 - dom;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
09/09 - seg;;;09:22 11:40 12:44 19:07;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:00;00:00;00:41;;;00:00;;;00:00;;;;;;
10/09 - ter;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
11/09 - qua;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
12/09 - qui;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
13/09 - ---;;;10:58 11:35 12:32 18:45;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;06:50;00:00;00:00;;;00:00;;;01:10;;;;;;
14/09 - sáb;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
;Jornada + Abono;;;;;;;Jornada total;;;;52:31 (52,52);;;;00:00 (0,0);;;;;;;;;Jornada noturna;;
;52:31 (52,52);;;;;;;Extra total;;;;01:37 (1,62);;;;;;;;;;;;;;;
;Trabalhado (Jor.+Ext.);;;;;;;Atraso efetivo;;;;00:00 (0,0);;;;00:00 (0,0);;;;;;;;;Antecipação efetiva;;
;54:07 (54,13);;;;;;;Devido;;;;27:34 (27,58);;;;00:00 (0,0);;;;;;;;;Abonado;;
;Faltas;(horas);;;;;;Devido (s/faltas);;;;03:34 (3,58);;;;00:00 (0,0);;;;;;;;;Abonado (s/faltas);;
;3;24:00 (24,0);;;;;;Extra efetivo;;;;01:37 (1,62);;;;00:00 (0,0);;;;;;;;;Desabonado;;
;Dias;Feriados trab.;;;;;;Devido efetivo;;;;27:34 (27,58);;;;03:35:00;;;;;;;;;Devido efet(s/faltas;;
;14;0;;;;;;Dias escalados;;;;10;;;;-25:58 (-25,97);;;;;;;;;Saldo de Horas;;
;;;;;;;;BdH Acumulado;;;;-328:10 (-328,17);;;;80:00 (80,0);;;;;;;;;Horas programadas;;
Controle de Extra;;;;;;;;;;;;;;;;;;;;;;;;;;;
Jornada;;;;;;;Jornada de trabalho;;;;;;;;;;;;;;;;;;;52:30 (52,52);
Assinatura Gestor/Supervisor;;;;;;;;;;;;;;;;;;;Assinatura;;;;;;;;

 

No codigo eu pego as infos com nome do empregador, e os dias trabalhados alem do total de horas.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import scala.util.matching.Regex 
import scala.io.Source


import com.sun.xml.internal.ws.util.StringUtils

object teste {
  def main(args: Array[String]): Unit = {
    
    val patternEmp = "\\;Empregado:\\;{4}([A-Za-z]*) ([A-Za-z]*) ([A-Za-z]*)\\;*".r;
    val patternWkDay = "([0-9]{2}/[0-9]{2}) - ([a-z]{3})\\;{3}([0-9: ]*).*".r;
    val patternWkJourney = "\\;Jornada \\+ Abono\\;{7}Jornada total\\;{4}([0-9]{2}:[0-9]{2}).*".r
    val patternFlagTotJourney = "\\;(Trabalhado \\(Jor.+Ext.\\))\\;{7}Atraso efetivo\\;{4}[0-9: (,)]*\\;{4}[0-9: (,)]*\\;{9}Antecipação efetiva\\;\\;".r
    val patternTotJourney = "\\;([0-9: (,)]*)\\;{7}Devido\\;{4}[0-9: (,)]*\\;{4}[0-9: (,)]*.*".r
    
    val regexs = Seq[scala.util.matching.Regex](patternEmp,patternWkDay,patternWkJourney,patternFlagTotJourney,patternTotJourney)
    
    val fileName = "RelExtraPorPeriodo.csv";
    for(line <- Source.fromFile(fileName).getLines){
      traduzLinha(line, regexs);
    }
  }
  
  def traduzLinha(line : String, regexs:Seq[scala.util.matching.Regex]): Unit = {
     regexs.foreach{
       m => m.findAllIn(line).matchData foreach {
         n => 
           if(m.equals(regexs(0))){
             println("Empregado: " + n.group(1) + " " + n.group(2)+ " " + n.group(3)) 
           }
           if(m.equals(regexs(1))){
             println(n.group(1)+ "-" + n.group(2) + ": " + n.group(3))
           }
           if(m.equals(regexs(2))){
            println("Jornada total: "+ n.group(1) + "\n")
           }
           if(m.equals(regexs(3))){
             println(n.group(1)+ ":")
           }
           if(m.equals(regexs(4))){
             println(n.group(1)+"\n")
           }
       }
     }
}
}

Saida do codigo:

 

Empregado: Roberto Gomes Soares

01/09-dom: 

02/09-seg: 10:25 12:34 13:35 18:28

03/09-ter: 09:18 12:04 13:23 19:33

04/09-qua: 09:37 11:16 11:56 18:51

05/09-qui: 09:47 12:18 13:15 18:16

06/09----: 08:54 11:13 11:58 16:12

08/09-dom: 

09/09-seg: 09:22 11:40 12:44 19:07

10/09-ter: 

11/09-qua: 

12/09-qui: 

13/09----: 10:58 11:35 12:32 18:45

Jornada total: 52:31

 

Trabalhado (Jor.+Ext.):

54:07 (54,13)

 

01/09-dom: 

02/09-seg: 

03/09-ter: 09:11 14:53

04/09-qua: 11:48 17:54 18:25 20:03

05/09-qui: 10:54 16:34 16:57 18:36

06/09----: 19:12

08/09-dom: 

09/09-seg: 

10/09-ter: 09:25 17:42 17:53 19:02

11/09-qua: 11:25 11:55 12:54 18:28 18:57 19:26

12/09-qui: 13:06 15:19 15:42

13/09----: 09:26 11:36 12:33 19:47

Jornada total: 35:52

 

Trabalhado (Jor.+Ext.):

45:39 (45,65)

 

Empregado: Gabriel Nunes Santos

01/09-dom: 

02/09-seg: 10:00 19:04

03/09-ter: 10:18 19:23

04/09-qua: 18:56

05/09-qui: 10:03 12:03

06/09----: 09:44

08/09-dom: 

09/09-seg: 09:32 18:48

10/09-ter: 11:16

11/09-qua: 09:14

12/09-qui: 18:27

13/09----: 

Jornada total: 26:00

 

Trabalhado (Jor.+Ext.):

29:25 (29,42)

 

Empregado: Paulo Bandeira J

01/09-dom: 

02/09-seg: 

03/09-ter: 

04/09-qua: 

05/09-qui: 

06/09----: 

08/09-dom: 

09/09-seg: 

10/09-ter: 

11/09-qua: 

12/09-qui: 

13/09----: 

Jornada total: 00:00

 

Trabalhado (Jor.+Ext.):

00:00 (0,0)

 

01/09-dom: 

02/09-seg: 11:40 17:19 17:28 18:45

03/09-ter: 11:24 19:02

04/09-qua: 11:20 13:05 13:53 19:03

05/09-qui: 12:34 14:22 14:53 20:46

06/09----: 11:13 12:51 13:59 16:59 17:09 18:41

08/09-dom: 

09/09-seg: 11:16 18:48

10/09-ter: 

11/09-qua: 10:32 13:42 14:34 18:16

12/09-qui: 10:52 13:58 15:24 18:44

13/09----: 11:37 20:18

Jornada total: 64:10

 

Trabalhado (Jor.+Ext.):

64:51 (64,85)

 

Empregado: Carlos Alex de

01/09-dom: 

02/09-seg: 11:01 12:34 13:35 19:50

03/09-ter: 12:01 12:06 15:45 19:37

04/09-qua: 11:32 13:10 13:46

05/09-qui: 10:55 12:16 13:15 18:27

06/09----: 11:43 19:34

08/09-dom: 

09/09-seg: 10:43 11:45 12:44 19:07

10/09-ter: 13:06 14:09 20:36

11/09-qua: 12:57 18:28 18:57 21:04

12/09-qui: 10:02 13:58 15:24 18:27

13/09----: 09:49 11:38 12:32 19:12

Jornada total: 56:40

 

Trabalhado (Jor.+Ext.):

56:40 (56,67)

 

01/09-dom: 

02/09-seg: 10:14 18:13

03/09-ter: 13:13 17:05

04/09-qua: 11:16 16:01 16:13 18:09

05/09-qui: 13:32 17:29

06/09----: 10:44 12:27 12:42 16:58

08/09-dom: 

09/09-seg: 09:45 12:28 12:34 17:52

10/09-ter: 13:06 19:34

11/09-qua: 12:11 18:40

12/09-qui: 13:03 14:32 14:37 18:23

13/09----: 

Jornada total: 50:00

 

Trabalhado (Jor.+Ext.):

54:40 (54,68)

 

Empregado: Carol Maria Rondelli

01/09-dom: 

02/09-seg: 10:03 13:02 13:14 19:15

03/09-ter: 15:45 19:15

04/09-qua: 10:51 18:04

05/09-qui: 12:57 16:58 17:04 19:15

06/09----: 12:47 18:54

08/09-dom: 

09/09-seg: 10:54 19:31

10/09-ter: 16:08 19:01

11/09-qua: 09:58 13:39 14:51 19:20

12/09-qui: 12:40 19:16

13/09----: 11:53 18:15

Jornada total: 55:04

 

Trabalhado (Jor.+Ext.):

64:40 (64,67)

 

Empregado: Diego Rodrigues Abrantes

01/09-dom: 

02/09-seg: 11:15 17:26

03/09-ter: 08:55 16:59

04/09-qua: 12:39 17:18

05/09-qui: 10:59 17:20

06/09----: 14:11 19:43

08/09-dom: 

09/09-seg: 11:45 17:37

10/09-ter: 12:56 19:20

11/09-qua: 11:00 14:49

12/09-qui: 11:22 18:13

13/09----: 10:46 18:50

Jornada total: 00:00

 

Trabalhado (Jor.+Ext.):

61:46 (61,78)

 

Percebe-se que tem algumas horas sem nome do funcionario. Alguem sabe oq pode estar ocasionando essa anomalia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por FabianoSouza
      Preciso criar uma regra no IIS (para fazer o rewrite da URL) em que eu consiga passar uma string no formato JSON (colchetes, chaves, vírgula, dois pontos e aspas).
      Estou tentando usar isso mas não funciona
       
      <rule name="aplicarFiltro"> <match url="^aplicar-filtro/([A-Za-z0-9])" /> <action type="Rewrite" url="/app/backend/filtros/aplicar.asp?str={R:1}" /> </rule>  
      Creio que o problema esteja nessa parte da regra expressão regular:
      <match url="^aplicar-filtro/([A-Za-z0-9])" />  
    • Por FabianoSouza
      Preciso criar uma expressão regular para retornar partes de uma string nesse padrão:
       
      https://meusite.com.br/dir1/dir2/pagina.aspx?id=123
       
      Preciso capturar separadamente:
      1) Os diretórios (dir1, dir2 e quantos tiverem)
      2) Nome da página com sua respectiva extensão
      3) O parâmetro com seu respectivo valor (id=123)
       
       
      Preciso disso para criar umas regras de URL Rewrite no IIS.
       
      Help pelo amor de God!
       
       
    • Por Maykel-ctba
      Boa tarde pessoal!
       
      Tenho a seguinte REGEX, . Ela serve para detectar se uma URL vem do Youtube ou do Vimeo, e possui os parâmetros necessários.
      (?:(?i)(?:https:|http:)?\/\/)?(?:(?i)(?:www\.youtube\.com\/(?:embed\/|watch\?v=)|youtu\.be\/|youtube\.googleapis\.com\/v\/)(?<YoutubeID>[a-z0-9-_]{11,12})|(?:vimeo\.com\/|player\.vimeo\.com\/video\/)(?<VimeoID>[0-9]+)) Ela é totalmente funcional no modelo PCRE (PHP). Testada aqui: https://regex101.com/r/PVdjg0/2
       
      Utilizo estes matches pra testar:
       
       
      Porém, preciso utiliza-la em um campo HTML dentro do atributo pattern. Por isso, preciso convertê-la para o padrão do JS. Mas aí começam uma série de problemas.
      Se eu utilizo como está, recebo o seguinte erro:
      ? The preceding token is not quantifiable
       
      Testes que realizei:
       
      - Se eu escapar o (?i) desta maneira: (/?i), só são validadas entradas do Vimeo.
      - Se eu deixar sem o ?, mesma coisa.
      - Se eu retirar a condição (?i), fica case sensitive, e não posso utilizar, pois videos do Youtube tem o parâmetro URL muitas vezes com maisculos, minusculos...
       
      Alguém pode me ajudar?
       
    • Por Guilherme Luiz
      Olá pessoal!
       
      Tenho uma situação onde preciso adicionar um FLAG se o usuário estiver incluindo um link em sua mensagem para que eu possa filtra-la ou não.
       
      Se estiver incluindo um link, preciso checar se esse link está autorizado. Se sim, adiciono um FLAG false, se não, true.
       
      Com links absolutos, isso é simples de ser feito e já tenho feito:
       
      <?php  $regex = "(((https?|ftp):\/\/)?(bit)?([a-z0-9+!*(),;?&=.-]+(:[a-z0-9+!*(),;?&=.-]+)?@)?([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))(:[0-9]{2,5})?(\/([a-z0-9+%-]\.?)+)*\/?(\?[a-z+&$_.-][a-z0-9;:@&%=+/.-]*)?(#[a-z_.-][a-z0-9+$%_.-]*)?)"; $linksAutorizados = ['bit.ly/123']; $mensagem = [ 'usuario' => 'teste', 'texto' => 'seja bem vindo ao meu site bit.ly/123' ]; $temLink = preg_match ($regex, $mensagem['texto'], $links); /** * $links retorna o seguinte array * 0: "bit.ly/123" * 3: "bit" * 7: "ly" * 8: "ly" * 13: "/123" * 14: "3" */ if ($temLink) { /* * Checo se link da mensagem é igual ao link da lista de linksAutorizados. * Se o link da mensagem for igual ao link da lista a mensagem não precisa ser filtrada * Se o link da mensagem for diferente ao link da lista, a mensagem precisa ser filtrada */ if ($links[0] == $linksAutorizados[0]) { $mensagem += [ 'filtrar' => false ]; } else { $mensagem += [ 'filtrar' => true ]; } } else { /* * Se não encontrar link na mensagem, ela não precisa ser filtrada */ $mensagem += [ 'filtrar' => false ]; } Obs: O acesso aos arrays foi em hardcoded para uma exemplificação mais clara.
       
      O meu problema é:
      E se eu quiser liberar links variáveis, ou seja, não importa o subdomínio ou demais parâmetros de querystring, checar somente o dominio
       
      Por exemplo
      *.meusite.com.br
      meusite.com.br/*
      subdominio.meusite.com.br/*
       
      Exemplo de array com links (que podem ser variaveis) autorizados para o usuario:
      $linksAutorizados = ['bit.ly/123', 'goo.gl/*', 'meusite.com.br/*' ];  
      Onde estão os asteriscos seriam os pontos que eu ignoro da verificação para filtro.
      Passei o dia fazendo alguns testes e pesquisando material no Stack mas não encontrei nada.
       
      Desde já muito obrigado por qualquer luz =)
    • Por Omar~
      Então, cá estou eu tentando fazer umas expressões regulares para validação de links para mídias sociais e me esbarrei em alguns problemas a averiguação da string:
      A ideia é ter uma expressão para cada mídia social presente no atual momento, só aceitando uma url válida para aquela mídia.
      Estou com um problema em passar condicionais que quando a string entrar num determinado formato ela deve seguir exatamente o modelo válido para aquela situação.
      Separei cada condicional em uma linha para melhor entendimento:
      <?php $urlA = "https://www.facebook.com/profile.php"; // ** ERA PARA SER INVÁLIDO $urlB = "https://www.facebook.com/profile.php?id="; // ERA PARA SER INVÁLIDO $urlC = "https://www.facebook.com/"; // ** ERA PARA SER INVÁLIDO $urlD = "https://www.facebook.com/Fulano"; // Válido, está OK $urlE = "https://www.facebook.com/profile.php?id=999999999999999"; // Válido, está OK $urlF = "https://www.facebook.com"; // ** ERA PARA SER INVÁLIDO $urlG = "https://www.faceboo"; // ** ERA PARA SER INVÁLIDO if (preg_match( '/^' . '(https[\:][\/][\/]www[\.]facebook[\.]com)' // Valida o endereço oficial da mídia . '?([\/])' // Caso contenha ou não uma "/" no final da url . '?([a-zA-Z À-ú 0-9]+)' // Valida se o link do perfil segue um modelo amigável (expl: /fulano) . '|(?:profile[\.]php[\?]id[\=]([0-9]{15}))' // Nessa condicional não estou acertando . '?(.*)' // Essa também não . '$/', $urlA)) { echo 'válido'; } else { echo 'inválido'; } Como podem notar são as duas últimas condicionais que estou com problemas, que são necessárias a correta averiguação das entradas na string, mas seu as adicionar assim como está no exemplo acima tudo desanda fazendo com que não der certo, uma vez removidas as urls que estão inválidas não são aceitas fazendo com que der certo, mas no entanto outras que são válidas passam a não ser aceitas.
      Onde estou errando? Ao meu ver escrevi a expressão corretamente, mas na prática está errada.
       
      Obs.: Por enquanto só escrevi essa para facebook farei para as demais depois que resolver esse empasse.
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.