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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problema con IsMatch en Regex
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con IsMatch en Regex  (Leído 10,510 veces)
z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Problema con IsMatch en Regex
« en: 1 Agosto 2013, 23:04 pm »

Hola buenas, pues a ver... Tengo un Regex que lo que hace es buscar esto:

Código
  1. Dim Line As String = File.ReadAllText(PathArchivo)
  2.    For Each Result As String In Line.Split(", ")
  3.                If Not Regex.IsMatch(Result, "^'|'$") Then
  4.                    MsgBox("Error", MsgBoxStyle.Critical, "Error")
  5. else
  6. msgbox(result)
  7.                End If
  8.    Next

El problema es cuando lee Line, puse a caso hecho una comilla de más, entre Split y Split, es decir:

Citar
INSERT INTO Videos VALUES(13455,1,9,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,''dfdfdfd',NULL,NULL,429060,NULL);
INSERT INTO Videos VALUES(13456,1,9,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,429060,NULL);
INSERT INTO Videos VALUES(13457,1,9,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,429060,NULL);

El caso es que salta la advertencia de Error todo el rato, como lo hago, que estoy haciendo mal?

Un saludo.


« Última modificación: 1 Agosto 2013, 23:43 pm por Ikillnukes » En línea


Interesados hablad por Discord.
z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: Problema con IsMatch en Regex
« Respuesta #1 en: 2 Agosto 2013, 01:52 am »

A veces soy muy pavico y no me paro a pensar... Y claro como llevaba prisa pues pasa lo que pasa:

Código
  1.            For Each Result As String In Line.Split(", ")
  2.                If Result.StartsWith("'") Or Result.StartsWith("""") Then
  3.                    If Not Regex.IsMatch(Result, "^'|'$") Then
  4.                        MsgBox("Error", MsgBoxStyle.Critical, "Error")
  5.                    Else
  6.                        MsgBox(Result)
  7.                    End If
  8.                Else
  9.                    MsgBox(Result)
  10.                End If
  11.            Next

Esta es la solución... ;)


En línea


Interesados hablad por Discord.
z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: Problema con IsMatch en Regex
« Respuesta #2 en: 2 Agosto 2013, 14:39 pm »

Perdón por hacer Triple post... Si queréis unirlo a mi me da igual.. ;)

A ver... No se si es problema mío o que es lo que es...

Código
  1. For Each Result As String In Line.Split(",")
  2.                If Result.Contains("'") Or Result.Contains("""") Then
  3.                    If Not Regex.IsMatch(Result, "^'|'$") Then
  4.                        MsgBox("Error", MsgBoxStyle.Critical, "Error")
  5.                    Else
  6.                        If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then
  7.                            MsgBox(Result)
  8.                        Else
  9.                            MsgBox("Error", MsgBoxStyle.Critical, "Error")
  10.                        End If
  11.                    End If
  12.                Else
  13.                    MsgBox(Result)
  14.                End If
  15.            Next

Archivo txt:

Citar
INSERT INTO Videos VALUES(13455,1,9,NULL,'Correcto','dhdhfh,NULL,NULL,NULL,NULL,NULL,NULL,NULL,''dfdfdfd',NULL,NULL,429060,NULL);

Hasta aquí todo correcto, el problema es cuando empieza a Splitear, he comprobado de que no me pone nada tal que " NULL", o cualquier cosa con:

Código
  1. MsgBox("""" & Result & """")

Ostias, ahora me estoy dando cuenta de que no hay espacios entre las comas... xD
PD: Así que no es problema del Spliteo... ;D



Pero por igual me sigue fallando la clasificatoria...

A ver... Todos me los muestra y ninguno me sale como Error, y hay 2 errores intencionados...

'dhdhfh y el otro ''dfdfdfd'

Deberían saltar 2 errores pero en vez de eso, saltan las MsgBox como si nada pasase....

Que estoy haciendo mal? Que alguien me lo explique...

PD: CountCharacter(Result, "'") cuenta cuantas ' y " hay... Hay no hay problema hay he probado sin el MsgBox Result y me muestra que en uno hay 1 y en el otro hay 3

Código
  1.    Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer
  2.        Dim cnt As Integer = 0
  3.        For Each c As Char In value
  4.            If c = ch Then cnt += 1
  5.        Next
  6.        Return cnt
  7.    End Function



He probado el Operador Mod con:

Código
  1. MsgBox(3 Mod 2 = 0)

y nada, si que lo hace bien... Según he leido por ahí, esto lo usan pa saber si es Par o Impar... En caso de que fuese Impar saltaría el error... Pero no salta... Creo que lo clasifica en:

Código
  1. For Each Result As String In Line.Split(",")
  2.                If Result.Contains("'") Or Result.Contains("""") Then
  3.                    If Not Regex.IsMatch(Result, "^'|'$") Then
  4.                        '... Todo este contenido se lo salta D:
  5.                    Else
  6.                        MsgBox(Result)
  7.                    End If
  8.                Else
  9.                    MsgBox(Result)
  10.                End If

Que puedo hacer? D:



He probado a poner:

Código
  1. MsgBox("Esta cadena contiene "" o ' en su interior...")
Y parece que si salta la advertertencia... Es decir que el error esta si o si, al final cuando lo va a detectar... :(

Código
  1. For Each Result As String In Line.Split(",")
  2.                If Regex.IsMatch(Result, "'") Or Regex.IsMatch(Result, """") Then
  3.                    MsgBox("Esta cadena contiene "" o ' en su interior...")
  4.                    If Not Regex.IsMatch(Result, "^'|'$") Then
  5.                        MsgBox("Esta cadena contiene "" o ' en su interior...3")
  6.                        MsgBox("Error", MsgBoxStyle.Critical, "Error")
  7.                    Else
  8.                        MsgBox("Esta cadena contiene "" o ' en su interior...2")
  9.                        If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then
  10.                            MsgBox("Esta cadena contiene "" o ' en su interior...5")
  11.                            MsgBox(Result)
  12.                        Else
  13.                            MsgBox("Esta cadena contiene "" o ' en su interior...6")
  14.                            MsgBox("Error", MsgBoxStyle.Critical, "Error")
  15.                        End If
  16.                    End If
  17.                Else
  18.                    MsgBox(Result)
  19.                End If

Siempre es lo mismo 1, 2, 5... Es decir que el error por descarte para 'dhdhfh está en la línea 4 y el otro ''dfdfdfd' está en la línea 9... :(

Lo estoy haciendo de alguna forma en la que los Ifs se los pasan por el Forro... :(



Si le cambio el orden, a esto:

Código
  1.                        If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0Then
  2.                            MsgBox("Esta cadena contiene "" o ' en su interior...5")
  3.                            MsgBox(Result)
  4.                        Else
  5.                            MsgBox("Esta cadena contiene "" o ' en su interior...6")
  6.                            MsgBox("Error", MsgBoxStyle.Critical, "Error")
  7.                        End If

Por esto:

Código
  1.                        If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then
  2.                            MsgBox("Esta cadena contiene "" o ' en su interior...6")
  3.                            MsgBox("Error", MsgBoxStyle.Critical, "Error")
  4.                        Else
  5.                            MsgBox("Esta cadena contiene "" o ' en su interior...5")
  6.                            MsgBox(Result)
  7.                        End If

Tira todo el rato para 1,2,6 :( p**a lógica... :(
« Última modificación: 2 Agosto 2013, 18:28 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Problema con IsMatch en Regex
« Respuesta #3 en: 2 Agosto 2013, 20:37 pm »

Lo estoy haciendo de alguna forma en la que los Ifs se los pasan por el Forro... :(

Pues intenta no escribir if's anidados... -> Select Case

Yo aquí sólo veo dos posts largos y ninguna pregunta... ¿Y si explicas de una manera decente específica lo que intentas hacer con todo esto?...quizás así, y sólo quizás, te podamos ayudar...
¿Porque intentas buscar las comillas al principio o al final de cada token?, ¿Porque intentas contar las comillas que tiene cada token?, ¿Cual es el fín de tu código?, ¿Que narices intentas hacer en realidad?, ¿Porque pones "trampas" a posta?, etc...

...y lo más importante, ¿Que maldito resultado es el que esperas obtener?, porque yo no entiendo que resultado quieres obtener, no sé si quieres obtener el string dentro de las comillas o que coj*nes.

Saludos...
« Última modificación: 2 Agosto 2013, 20:42 pm por EleKtro H@cker » En línea

z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: Problema con IsMatch en Regex
« Respuesta #4 en: 2 Agosto 2013, 21:34 pm »

Pues intenta no escribir if's anidados... -> Select Case

Te las he visto usar varias veces... Voy a ver lo que puedo sacar...

Yo aquí sólo veo dos posts largos y ninguna pregunta... ¿Y si explicas de una manera decente específica lo que intentas hacer con todo esto?...quizás así, y sólo quizás, te podamos ayudar...

Bueno a ver te lo explico... Mi app lo que hace es limpiar las strings, como puedes ver hay una string mal hecha que si la abres con el Sublime text en SQL:

http://pastebin.com/Siy0gK67

Puedes ver lo que pasa... :P

¿Porque intentas buscar las comillas al principio o al final de cada token?

Para ver si la string está formulada correctamente...

¿Porque intentas contar las comillas que tiene cada token?

Para así poder saber si por igual está bien hecha, es decir, puede que a veces haya una string así:

un token, 'otro token con algo de texto, error' y más texto', otro token

Si en ese token: 'otro token con algo de texto, error' y más texto' hay 3 (numero impar) o más de 3 comillas ya significa que algo no está bien. :P

¿Cual es el fín de tu código?

Ya lo he explicado, y bueno, pues la finalidad es limpiar Strings de un SQL que se haya exportado mal desde otro programa...

¿Que narices intentas hacer en realidad?

Ya te lo he explicado... xD


¿Porque pones "trampas" a posta?

Trampas, quien ha dicho trampas, si me lo explicases a que te refieres, no veo trampas... O si? No se... xD

...y lo más importante, ¿Que maldito resultado es el que esperas obtener?, porque yo no entiendo que resultado quieres obtener, no sé si quieres obtener el string dentro de las comillas o que coj*nes...

Pues por ejemplo uno de los resultados es Escapar la String, por ejemplo en ese tan bonito token 'otro token con algo de texto, error' y más texto', pues:

'otro token con algo de texto, error\' y más texto'

Ale ya te he explicao lo que quiero hacer... Seguro que ahora los de la CIA me cogen la patente... :( xD



Código
  1. Select Case Result
  2.                    Case Regex.IsMatch(Result, "^'|'$") = False Or Regex.IsMatch(Result, "^""|""$") = False
  3.                        MsgBox("Error: #1")
  4.                    Case CountCharacter(Result, "'") Mod 2 = True Or CountCharacter(Result, """") Mod 2 = True
  5.                        MsgBox("Error: #2")
  6.                    Case Else
  7.                        MsgBox(Result)
  8.                End Select

Joder, pos si que es verdad que se ahorra texto, pero por igual no me muestra que sean errores... :(
« Última modificación: 2 Agosto 2013, 22:02 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Problema con IsMatch en Regex
« Respuesta #5 en: 2 Agosto 2013, 22:18 pm »

vale quieres formatear el string escapando comillas sueltas...

Dime cual de estos resultados es incorrecto:

1: 'bla 'bla' bla' -> 'bla \'bla\' bla'

2: 'bla bla' bla' -> 'bla bla\' bla'

3: 'bla 'bla' 'bla' -> 'bla 'bla' \'bla'

...es decir, ¿Hay que escapar cualquier comilla que esté dentro de la primera y última comilla, o sólamente hay que escapar las comillas impares?

Imagino que habrá que escaparlas todas como en el primer y segundo ejemplo, como en otros lenguajes, pero por si acaso...
En línea

z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: Problema con IsMatch en Regex
« Respuesta #6 en: 2 Agosto 2013, 22:28 pm »

¿Hay que escapar cualquier comilla que esté dentro de la primera y última comilla...

Hay le has dao. :D

...hay que escapar las comillas impares?

Nope.



Claro, lo que tu dices, hay que escapar las comillas que estén dentro de esas subcomillas... Es decir, lo primero que tu has preguntado.. :P

Es decir:

1: 'bla 'bla' bla' -> 'bla \'bla\' bla'

2: 'bla bla' bla' -> 'bla bla\' bla'

3: 'bla 'bla' 'bla' -> 'bla 'bla' \'bla'

Correción para el 3º: 3: 'bla 'bla' 'bla' -> 'bla \'bla\' \'bla'
« Última modificación: 2 Agosto 2013, 22:35 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Problema con IsMatch en Regex
« Respuesta #7 en: 2 Agosto 2013, 23:31 pm »

En lugar de usar una expresión regular para comprobar si tiene comillas... o calcular cuantas comillas hay en el token... diréctamente hago los reemplazos:

Código
  1. Public Class Form1
  2.  
  3.    Dim strarray() As String = _
  4.    "NULL,'Correcto','mal,NULL,''mal'',NULL,'mal'',NULL,''mal',mal',NULL".Split(",")
  5.  
  6.    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
  7.  
  8.        For Each value In strarray
  9.  
  10.            Select Case True
  11.  
  12.                Case value.StartsWith("'") AndAlso value.EndsWith("'")
  13.                    MsgBox(String.Format("'{0}'", value.Substring(1, value.Length - 2).Replace("'", "\'")))
  14.  
  15.                Case value.StartsWith("'") AndAlso Not value.EndsWith("'")
  16.                    MsgBox(value.Replace("'", "\'"))
  17.  
  18.                Case value.EndsWith("'") AndAlso Not value.StartsWith("'")
  19.                    MsgBox(value.Replace("'", "\'"))
  20.  
  21.                Case Else
  22.                    MsgBox(value)
  23.  
  24.            End Select
  25.  
  26.        Next value
  27.  
  28.    End Sub
  29.  
  30. End Class

Saludos...
« Última modificación: 2 Agosto 2013, 23:34 pm por EleKtro H@cker » En línea

z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Re: Problema con IsMatch en Regex
« Respuesta #8 en: 2 Agosto 2013, 23:42 pm »

Ala con la tontería me has hecho la app... :P

Código
  1.            For Each Result As String In Regex.Split(Line, ",|\n")
  2.  
  3.                Select Case True
  4.  
  5.                    Case Result.StartsWith("'") AndAlso Result.EndsWith("'")
  6.                        MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'")))
  7.  
  8.                    Case Result.StartsWith("'") AndAlso Not Result.EndsWith("'")
  9.                        MsgBox(Result & "'")
  10.  
  11.                    Case Result.EndsWith("'") AndAlso Not Result.StartsWith("'")
  12.                        MsgBox("'" & Result)
  13.  
  14.                    Case Else
  15.                        MsgBox(Result)
  16.  
  17.                End Select
  18.            Next Result

Ahora ya solo me falta enumerar los errores y varias cosillas más pa meterlas en un Log... :P (Entre las cosillas, hay una que puede que a lo mejor no sepa hacer o puede que si, y es buscar la String original y sustituirla por la nueva dentro de un archivo... Veré lo que hago... :P

Por cierto, se me olvidaba...

¡Muchas gracias! :D



Tengo una mini-duda...

Código
  1. MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'")))

En caso de que se tuviese que reemplazar algo, como hago para mostrar una MsgBox... ??



Otra duda que me ha asaltado... En caso de que fuese unas "" lo que hubiese que reemplazar, tengo que hacer otro Select Case o dentro del mismo?... Bueno en realidad, no se ni porque no lo hago >:D Estoy modo l33t no te puedo fallar. :P

Ya lo he arreglado con:

Código
  1.                Select Case True
  2.  
  3.                    Case Result.StartsWith("'") AndAlso Result.EndsWith("'")
  4.                        MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'")))
  5.  
  6.                    Case Result.StartsWith("'") AndAlso Not Result.EndsWith("'")
  7.                        MsgBox(Result & "'")
  8.  
  9.                    Case Result.EndsWith("'") AndAlso Not Result.StartsWith("'")
  10.                        MsgBox("'" & Result)
  11.  
  12.                        '-----------------------
  13.  
  14.                    Case Result.StartsWith("""") AndAlso Result.EndsWith("""")
  15.                        MsgBox(String.Format("""{0}""", Result.Substring(1, Result.Length - 2).Replace("""", "\""")))
  16.  
  17.                    Case Result.StartsWith("""") AndAlso Not Result.EndsWith("""")
  18.                        MsgBox(Result & """")
  19.  
  20.                    Case Result.EndsWith("""") AndAlso Not Result.StartsWith("""")
  21.                        MsgBox("""" & Result)
  22.  
  23.                    Case Else
  24.                        MsgBox(Result)
  25.  
  26.                End Select

Pero la duda de las MsgBox me sigue asaltando... :-\
« Última modificación: 2 Agosto 2013, 23:51 pm por Ikillnukes » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.810



Ver Perfil
Re: Problema con IsMatch en Regex
« Respuesta #9 en: 2 Agosto 2013, 23:54 pm »

buscar la String original y sustituirla por la nueva dentro de un archivo...
-> .Replace

Código
  1. MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'")))
En caso de que se tuviese que reemplazar algo, como hago para mostrar una MsgBox... ??

No entiendo la duda.

-> String.Format

En caso de que fuese unas "" lo que hubiese que reemplazar, tengo que hacer otro Select Case o dentro del mismo?...

Puedes añadir las condiciones (Cases) que quieras...

Saludos
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOURCE] RegEx .NET
.NET (C#, VB.NET, ASP)
Eleкtro 3 3,622 Último mensaje 11 Septiembre 2013, 16:53 pm
por Eleкtro
[Solucionado]Duda con regex « 1 2 »
Java
.:UND3R:. 14 6,773 Último mensaje 26 Noviembre 2013, 21:05 pm
por .:UND3R:.
Orden de regex en java
Java
.:UND3R:. 2 1,740 Último mensaje 26 Noviembre 2013, 23:35 pm
por .:UND3R:.
php no soporta regex complejo
PHP
franfis 6 3,023 Último mensaje 30 Marzo 2014, 15:22 pm
por franfis
Ayuda con Regex
Programación General
BlackM4ster 0 1,569 Último mensaje 19 Abril 2014, 14:17 pm
por BlackM4ster
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines