hb_RegEx

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_RegEx

Mensagem por JoséQuintas »

Estou querendo fazer validações nos meus fontes, mas não tenho idéia se hb_regex poderia ajudar.

Exemplo:

Tenho lá a função ADOField( "CAMPO", "C", "TABELA"..... ou ADOField( "CAMPO", "N", "TABELA"...

Esse segundo parâmetro indica o tipo de campo, mas vira e mexe eu esqueço de colocar.
Queria validar os fontes, se tem algum sem isso.
Dá pra fazer?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

hb_RegEx

Mensagem por Kapiaba »

Não entendi muito bem o queres fazer, veja se esse código ajuda.

Veja também: HB_ISREGEX().

Código: Selecionar todos

FUNCTION Main()

   Local s := "ClaAbrok aBbey", n1, n2
 
   ? hb_isregex( hb_regexcomp( "a+b+" ) )                // .T.

   n1 := 1
   n2 := Len( s )

   ? hb_atx( "a+b+", s, .f., @n1, @n2 ), n1, n2          // aAb      3     3

   ? hb_regexhas( "a+b+", s, .f. )                       // .T.
   ? hb_regexhas( "a+b+", s )                            // .F.

   ? hb_regexlike( "a+b+", s, .f. )                      // .F.
 
   PrintArray( hb_regex( "a+b+",s,.f. ) )                // { aAb }
   PrintArray( hb_regex( "(a+)(b+)",s,.f. ) )            // { aAb aA b }
 
   PrintArray( hb_regexSplit( "a+b+",s,.f. ) )           // { Cl rok  ey }
 
   PrintArray( hb_regexAtx( "a+b+",s,.f. ) )             // { { aAb 3 5 } }
   PrintArray( hb_regexAtx( "(a+)(b+)",s,.f. ) )         // { { aAb 3 5 } { aA 3 4 } { b 5 5 } }
 
   PrintArray( hb_regexAll( "a+b+",s,.f. ) )             // { { aAb aBb } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f. ) )         // { { aAb aA b } { aBb a Bb } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,1 ) )     // { aAb aBb }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,2 ) )     // { aA a }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,0,.f. ) ) 

   // { { { aAb 3 5 } { aA 3 4 } { b 5 5 } } { { aBb 10 12 } { a 10 10 } { Bb 11 12 } } }
   PrintArray( hb_regexAll( "(a+)(b+)",s,.f.,,,1,.f. ) ) // { { aAb 3 5 } { aBb 10 12 } }
 
Return Nil
 
Function PrintArray( arr, lNoNewLine )

   Local i
 
   IF lNoNewLine == Nil .OR. !lNoNewLine
      ?
   ENDIF

   ?? " {"

   FOR i := 1 TO Len( arr )

      IF Valtype( arr[i] ) == "A"
         PrintArray( arr[i], .T. )
      ELSE
         ?? " " + Iif( Valtype( arr[i] ) == "N", Ltrim(Str(arr[i])), arr[i] )
      ENDIF

   NEXT

   ?? " }"

Return Nil
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_RegEx

Mensagem por JoséQuintas »

Quero pegar cada linha, procurar ADOField(, e confirmar se tem "N" ou "C", ou "D"

Talvez aplicar um filtro do hb_RegEx() que já separe todas as linhas erradas.

Mas agora que fui explicar, talvez consiga pelo prompt, só não sei como indicar texto com aspas entre aspas.... rs

COPY *.PRG LIXO.TXT
TYPE LIXO.TXT ! find /i /n "adofield" | find /i ""N"" | find /i ""D"" | find /i ""C""
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_RegEx

Mensagem por JoséQuintas »

Fiz do jeito antigo....
Procura aonde tem ADOFIELD(, e verifica se "C" vém antes do fim de linha chr(13)

Código: Selecionar todos

   cText := Upper( MemoRead( cFile ) )
   DO WHILE nKey != K_ESC .AND. "ADOFIELD(" $ cText
      nKey := Inkey()
      cText := Substr( cText, At( "ADOFIELD(", cText ) )
      IF At( ["C"], cText ) < At( Chr(13), cText )
      //ELSEIF At( ["X"], cText  ) < At( Chr(13), cText )
      //ELSEIF At( ["X"], cText ) < At( Chr(13), cText )
      ELSE
         SayScroll( cFile + "*** ERRO ADOField ***" )
         SayScroll( Substr( cText, 1, At( Chr(13), cText ) - 1 ) )
      ENDIF
      cText := Substr( cText, At( Chr(13), cText ) )
   ENDDO
Fiz de propósito apenas "C", e sobraram os com "N", e, lógico... o programa de teste que foge da regra.
adofield.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_RegEx

Mensagem por JoséQuintas »

Então... tem casos aonde eu pegava um texto pra mostrar.
em DBF:

Código: Selecionar todos

Encontra( nota->cliente, "jpcadastro", "numlan" )
@ Row(), 32 SAY jpcadastro->cdNome
Em ADO, transformei isso em

Código: Selecionar todos

@ Row(), 32 SAY ADOField( "CDNOME", "C", "JPCADASTRO", "IDCADASTRO=" + StringSql( nota->cliente ) )
é que o conteúdo poderia ser nulo, então indico o tipo de resultado que quero, por isso o "C", ou "N", ou "D", ou o que precisar.

Acontece que corre o risco de na hora de digitar, eu esquecer de indicar o tipo, e poderia acontecer erro em run-time.
É uma rotina pra conferir minha digitação nos fontes.

Foi o quebra-galho em ADO que encontrei: passo o campo que quero, qual a tabela pesquisar, qual a chave de pesquisa, e também o tipo de retorno que espero.
Isso economiza muito fonte, seja híbrido dbf+MySQL ou seja MySQL sozinho.

Vários deles vão sumir, quando o SELECT principal trouxer tudo pronto, mas por enquanto foi meu quebra-galho.
Troquei duas linhas usando DBF por uma usando ADO... tá bom por enquanto...

Mas como estou mexendo rápido nessas coisas... fico na dúvida se esqueci de indicar o tipo em algum lugar.

A rotina deste post vai conferir se esqueci em algum fonte.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_RegEx

Mensagem por JoséQuintas »

Faltou completar...
O que queria com hb_RegEx() era procurar ADOField( "any", "C" )
Se o segundo parâmetro estava devidamente preenchido com N ou C ou D

À primeira vista, seria parecido com isto (não está em formato hb_RegEx)

*ADOField("*", "?", *

* = qualquer coisa
? = um caractere específico
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder