elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Expresion regular para filtrar una búsqueda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Expresion regular para filtrar una búsqueda  (Leído 6,798 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Expresion regular para filtrar una búsqueda
« en: 29 Agosto 2010, 15:47 pm »

Hola, estoy intentando resolver lo siguiente, si se fijan en la búsqueda de windows utiliza cierta expresiones para resolver la búsqueda por ejemplo si ingresamos

Citar
casa *.bmp

Nos devuelve todos los archivos .bmp y cualquier tipo de archivo que contenga la palabra casa

Citar
*.jpg *.bmp

Nos devuelve todos los archivos .bmp y .jpg

Citar
???.bmp

Nos devuelve todos los archivos .bmp de 3 letras por ejemplo "Cut.bmp" "New.bmp"

Citar
ar*.bmp

nos devuelve todos los archivos .bmp que comienzen con "ar"


que tipo de expresión regular debería implementar para poder cumplir esas condiciones

intento hacer una función parecida a esta

Código:
Private Function IsInFilter(ByVal sFilter As String, ByVal sMatch As String) As Boolean
'-------
End Function


Código:
Debug.Print IsInFilter("*.bmp ????.jpg", "foto.png")

Gracias


En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #1 en: 29 Agosto 2010, 16:02 pm »

Hola LeandroA!!
Mira, te hice un ejemplo (Creo que es similar a lo que buscas):

Código
  1. Option Explicit
  2.  
  3. Public Function Get_Extensions_Files(ByVal sText As String, ByVal sPatern As String) As Collection
  4. Dim cTemp                               As New Collection
  5. Dim oRegExp                             As Object
  6. Dim oMatch                              As Object
  7. Dim oMatches                            As Object
  8.    '# Para evitar las referencias :P
  9.    Set oRegExp = CreateObject("VBScript.RegExp")
  10.  
  11.    With oRegExp
  12.        .Pattern = sPatern
  13.        .Global = True
  14.        .IgnoreCase = True
  15.    End With
  16.    Set oMatches = oRegExp.Execute(sText)
  17.  
  18.    For Each oMatch In oMatches
  19.        cTemp.Add oMatch.Value
  20.    Next
  21.  
  22.    Set Get_Extensions_Files = cTemp
  23. End Function

Un ej:
Código
  1. Private Sub Form_Load()
  2.    Dim vItem               As Variant
  3.    Dim sStringtoAnalyze    As String
  4.  
  5.    sStringtoAnalyze = "Hola, esto es un ejemplo LeandroA.jpg para que veas que funciona Mi_foto.jpg"
  6.    For Each vItem In Get_Extensions_Files(sStringtoAnalyze, "(\S)+\.jpg")
  7.        Debug.Print vItem
  8.    Next
  9. End Sub

Resultado:
Citar
LeandroA.jpg
Mi_foto.jpg

PD: Si tienes problemas, se puede mejorar la Expresion Regular, te lo he hecho "a lo rapido" :P

Espero haberte ayudado ;)

DoEvents¡! :P

EDIT:

Para sacar jpg y bmp:
Código:
((\S)+\.(jpg|bmp))

????.jpg es igual a:
Código:
(\S{4}\.jpg)

ar*.jpg equivale a :
Código:
(ar(\S)*\.jpg)



« Última modificación: 29 Agosto 2010, 18:14 pm por *PsYkE1* » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #2 en: 29 Agosto 2010, 18:15 pm »

Contestare en forma rapida, no dispongo de mucho tiempo. Al final tuve tiempo de mas y experimente un poco  ;)

lo que hay que hacer es reemplazar los filtros antes de pasarlos por expresiones regulares:

Reemplazar los puntos "." por "\."
Los comodines "?" representan un solo caracter: .
Los comodines "*" representan mas de un caracter: .+

Por lo que quedarian los filtros asi
Citar

Código:
casa *.bmp
Código:
casa .+\.bmp



Código:
???.bmp
Código:
...\.bmp



Código:
ar*.bmp
Código:
ar.+\.bmp

Hay un problema con este filtro
Código:
*.jpg *.bmp
si fuera por reemplazo quedaria asi
Código:
.+\.jpg .+\.bmp
pero eso no devolvera los valores esperados, ya que ninguno devolvera true salvo que sea bmp con ".jpg" en su nombre :P

Asi que si en caso fuera asi, habria que probar antes si el filtro concuerda con esta expresion regular
Código:
((?:\*|\?+)\.\w+\s?)+
La contra de este filtro es que no se va a poder mezclar con otros filtros... por lo que quedaria (codigo al vuelo, es muy probable de que tire algun error)

Código
  1. ' Basado en el de PySkE1
  2. Public Function IsInFilter(ByVal sPatern As String, ByVal sText As String) As Boolean
  3. Dim cTemp                               As New Collection
  4. Dim oRegExp                             As Object
  5. Dim oMatch                              As Object
  6. Dim oMatches                            As Object
  7. Dim i As Integer
  8.    '# Para evitar las referencias :P
  9.    Set oRegExp = CreateObject("VBScript.RegExp")
  10.    With oRegExp
  11.        .Pattern = "(\*|\?+)\.\w+"
  12.        .Global = True
  13.        .IgnoreCase = True
  14.    End With
  15.    Set oMatches = oRegExp.Execute(sPatern)
  16.  
  17.    sPatern = ReplaceFilter(sPatern)
  18.  
  19.    If oMatches.Count > 0 Then
  20.        For Each oMatch In oMatches
  21.            cTemp.Add oMatch.Value
  22.        Next
  23.  
  24.        Dim vItem As Variant
  25.        For Each vItem In cTemp
  26.            vItem = ReplaceFilter(CStr(vItem))
  27.            oRegExp.Pattern = vItem
  28.            Set oMatches = oRegExp.Execute(sText)
  29.            If oMatches.Count > 0 Then
  30.                IsInFilter = True
  31.                Exit Function
  32.            End If
  33.        Next
  34.    Else
  35.        oRegExp.Pattern = sPatern
  36.        Set oMatches = oRegExp.Execute(sText)
  37.        If oMatches.Count > 0 Then
  38.            IsInFilter = True
  39.            Exit Function
  40.        End If
  41.    End If
  42. End Function
  43.  
  44. Public Function ReplaceFilter(Filtro As String) As String
  45.    Filtro = Replace(Filtro, ".", "\.")
  46.    Filtro = Replace(Filtro, "*", ".+")
  47.    ReplaceFilter = Replace(Filtro, "?", ".")
  48. End Function
  49.  

Código
  1. Private Sub Form_Load()
  2.    Debug.Print IsInFilter("a.jpg", "?.jpg")
  3.    Debug.Print IsInFilter("foto.jpg", "*.jpg")
  4.    Debug.Print IsInFilter("foto.jpg", "*.jpg *.bmp")
  5.    Debug.Print IsInFilter("foto.bmp", "*.jpg *.bmp")
  6.    Debug.Print IsInFilter("cualquiera.blend", "*.jpg *.bmp")
  7. End Sub
  8.  

Espero que te sirva! :P
« Última modificación: 29 Agosto 2010, 20:27 pm por raul338 » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #3 en: 29 Agosto 2010, 18:20 pm »

Exacto raul338!!  ;-)
Ahora si que si... :D
Tambien pense algo asi, pero me pudo la vagancia... :silbar: :laugh:

DoEvents¡! :P


En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #4 en: 29 Agosto 2010, 20:20 pm »

hola gracias a ambos, en realidad es mas complicado de lo que parece.

hice un par de pruebas y no esta correcto.

 MsgBox IsInFilter("*.bmp *jpg", "foto.bmp") = falso ( es verdadero)

 MsgBox IsInFilter("*.bmp ????.jpg", "foto.jpg") = falso ( es verdadero)

 MsgBox IsInFilter("*.bmp", "foto.bmp")  = falso ( es verdadero)

no se si se entendio bien
el usuario en la busqueda tipea "*.bmp ????.jpg" luego a medida que se realiza la busqueda iran pasando una series de archivos por la funcion.
Por ejemplo "calc.exe", "documento.doc", "Mi foto.bmp" etc. etc.

ejemplos correctos

"*.bmp; *.jpg *.png" este ejemplo lista todos los .bmp, .jpg, .png que pasen por la funcion  (y notece que ensima en una parte puse ";" y en otra no)

"a?????.bmp" este por ejmplo va a filtrar todos .bmp los que comienzen con a y tengan cinco letras intermedias "Azteca.bmp" "active.bmp"

bueno el mejor ejemplo esta en la busqueda de windows si buscan algo veran como trabaja.

SAludos

En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #5 en: 29 Agosto 2010, 20:27 pm »

hice un par de pruebas y no esta correcto.

 MsgBox IsInFilter("*.bmp *jpg", "foto.bmp") = falso ( es verdadero)

 MsgBox IsInFilter("*.bmp ????.jpg", "foto.jpg") = falso ( es verdadero)

 MsgBox IsInFilter("*.bmp", "foto.bmp")  = falso ( es verdadero)

no se si se entendio bien

Leandro... no se si te diste cuenta, pero, lo estas usando al revez  :xD
De todas formas, cambiando el orden los parametros (o la firma) tiran true  ;D
Ahi cambie la firma en el codigo anterior...
« Última modificación: 29 Agosto 2010, 20:29 pm por raul338 » En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #6 en: 29 Agosto 2010, 20:31 pm »

Que bruto que soy, tenes razón no me habia dado cuenta que están cambiado los parámetros jejeje

buenisimo funciona de lujo. :laugh: :laugh:

este quizas no tira correcto

 MsgBox IsInFilter("a?????.bmp", "Azteca.bmp") = true

 MsgBox IsInFilter("a?????.bmp", "Aztsdfdfdseca.bmp") = true

la segunda deberia ser false, voy a ver si me sale algo
« Última modificación: 29 Agosto 2010, 20:36 pm por LeandroA » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #7 en: 29 Agosto 2010, 20:41 pm »

MsgBox IsInFilter("a?????.bmp", "Aztsdfdfdseca.bmp") = true
 deberia ser false

Asi que si en caso fuera asi, habria que probar antes si el filtro concuerda con esta expresion regular
Código:
((?:\*|\?+)\.\w+\s?)+
La contra de este filtro es que no se va a poder mezclar con otros filtros... por lo que quedaria (codigo al vuelo, es muy probable de que tire algun error)

Jajaja toy quedando re pesado seguro, pero es lo que se me ocurrio a mi, la solucion, cambiar la expresion regular :P pero.... ahora no tengo tiempo (apenas me paso de a ratos por aca)
De todas formas, debe ser simple el reemplazo, capaz agregando un \w+ o .+ en el medio :P
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #8 en: 29 Agosto 2010, 21:54 pm »

Os dejo esta funcion por si ayuda... ;)

Código
  1. Public Function ReplaceFilter(ByVal Filtro As String) As String
  2. Dim x                           As Integer
  3. Dim n                           As Integer
  4. Dim sActualChar                 As String
  5.    x = 1 : n = 1
  6.    Do Until x > Len(Filtro)
  7.        sActualChar = Mid$(Filtro, x, 1)
  8.        If sActualChar = "?" Then
  9.            Do While Mid$(Filtro, x + 1, 1) = "?"
  10.                n = n + 1
  11.                x = x + 1
  12.            Loop
  13.            sActualChar = ".{" & n & "}"
  14.            n = 1
  15.        ElseIf sActualChar = "." Then
  16.            sActualChar = "\."
  17.        End If
  18.        ReplaceFilter = ReplaceFilter + sActualChar
  19.        x = x + 1
  20.    Loop
  21.    ReplaceFilter = Replace$(ReplaceFilter, "*", ".+")
  22.    ReplaceFilter = Replace$(ReplaceFilter, " ", "|")
  23.    ReplaceFilter = "(" & ReplaceFilter & ")"
  24. End Function

Un ejemplo:
Código
  1. Private Sub Form_Load()
  2.    MsgBox ReplaceFilter("a*.jpg ????.bmp")
  3. End Sub

Me devuelve:
Citar
(a.+\.jpg|.{4}\.bmp)

Te da la Expresion Regular toda bonita  ::)

DoEvents¡! :P

EDITO: Se me ocurre otra forma de hacerlo, mañana posteo.. :)
« Última modificación: 29 Agosto 2010, 22:58 pm por *PsYkE1* » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Expresion regular para filtrar una búsqueda
« Respuesta #9 en: 29 Agosto 2010, 23:45 pm »

Bueno, no me pude aguantar, aqui tienes LeandroA  ;):

Código
  1. Option Explicit
  2.  
  3. Public Function IsInFilter(ByVal sText As String, ByVal sPatern As String) As Boolean
  4. Dim oRegExp                             As Object
  5. Dim oMatches                            As Object
  6.    Set oRegExp = CreateObject("VBScript.RegExp")
  7.    sText = " " & sText
  8.    sPatern = ReplaceFilter(sPatern)
  9.    With oRegExp
  10.        .Pattern = sPatern
  11.        .Global = True
  12.        .IgnoreCase = True
  13.    End With
  14.    Set oMatches = oRegExp.Execute(sText)
  15.    IsInFilter = CBool(oMatches.Count)
  16. End Function
  17.  
  18. Public Function ReplaceFilter(ByVal sFilter As String) As String
  19. Dim x                                   As Integer
  20. Dim n                                   As Integer
  21. Dim sActualChar                         As String
  22.    x = 1: n = 1
  23.    Do Until x > Len(sFilter)
  24.        sActualChar = Mid$(sFilter, x, 1)
  25.        If sActualChar = "?" Then
  26.            Do While Mid$(sFilter, x + 1, 1) = "?"
  27.                n = n + 1
  28.                x = x + 1
  29.            Loop
  30.            sActualChar = ".{" & n & "}"
  31.            n = 1
  32.        ElseIf sActualChar = "." Then
  33.            sActualChar = "\."
  34.        End If
  35.        ReplaceFilter = ReplaceFilter + sActualChar
  36.        x = x + 1
  37.    Loop
  38.    ReplaceFilter = Replace$(ReplaceFilter, "*", ".+")
  39.    ReplaceFilter = Replace$(ReplaceFilter, " ", "|")
  40.    If Left$(sFilter, 1) = "?" Then
  41.        ReplaceFilter = "(\s" & ReplaceFilter & ")"
  42.    Else
  43.        ReplaceFilter = "(" & ReplaceFilter & ")"
  44.    End If
  45. End Function
  46.  
  47. ' OffTopic : "Vivan las ranas¡!"
  48. Private Sub Form_Load()
  49.    Debug.Print IsInFilter("holal.jpg", "?????.jpg")    'True
  50.    Debug.Print IsInFilter("a.jpg", "?.jpg")            'true
  51.    Debug.Print IsInFilter("foto.jpg", "*.jpg")         'True
  52.    Debug.Print IsInFilter("foto.jpg", "*.jpg *.bmp")   'True
  53.    Debug.Print IsInFilter("foto.bmp", "*.jpg *.bmp")   'True
  54.    Debug.Print IsInFilter("cualquiera.blend", "*.jpg *.bmp") 'False
  55.    ' Los ejemplos que pusiste
  56.    Debug.Print IsInFilter("Azteca.bmp", "a?????.bmp") 'True
  57.    Debug.Print IsInFilter("Aztsdfdfdseca.bmp", "a?????.bmp") 'False
  58. End Sub

Me devuelve:
Citar
Verdadero
Verdadero
Verdadero
Verdadero
Verdadero
Falso
Verdadero
Falso
::)

DoEvents¡! :P
« Última modificación: 29 Agosto 2010, 23:56 pm por *PsYkE1* » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines