Autor
|
Tema: Problema con IsMatch en Regex (Leído 11,237 veces)
|
z3nth10n
Desconectado
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
Hola buenas, pues a ver... Tengo un Regex que lo que hace es buscar esto: Dim Line As String = File. ReadAllText(PathArchivo ) For Each Result As String In Line.Split(", ") If Not Regex.IsMatch(Result, "^'|'$") Then MsgBox("Error", MsgBoxStyle.Critical, "Error") else msgbox(result) End If Next
El problema es cuando lee Line, puse a caso hecho una comilla de más, entre Split y Split, es decir: 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
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
A veces soy muy pavico y no me paro a pensar... Y claro como llevaba prisa pues pasa lo que pasa: For Each Result As String In Line.Split(", ") If Result.StartsWith("'") Or Result.StartsWith("""") Then If Not Regex.IsMatch(Result, "^'|'$") Then MsgBox("Error", MsgBoxStyle.Critical, "Error") Else MsgBox(Result) End If Else MsgBox(Result) End If Next
Esta es la solución...
|
|
|
En línea
|
⏩ Interesados hablad por Discord.
|
|
|
z3nth10n
Desconectado
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
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... For Each Result As String In Line.Split(",") If Result.Contains("'") Or Result.Contains("""") Then If Not Regex.IsMatch(Result, "^'|'$") Then MsgBox("Error", MsgBoxStyle.Critical, "Error") Else If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then MsgBox(Result) Else MsgBox("Error", MsgBoxStyle.Critical, "Error") End If End If Else MsgBox(Result) End If Next
Archivo txt: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: 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...
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 Public Function CountCharacter(ByVal value As String, ByVal ch As Char) As Integer Dim cnt As Integer = 0 For Each c As Char In value If c = ch Then cnt += 1 Next Return cnt End Function
He probado el Operador Mod con: 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: For Each Result As String In Line.Split(",") If Result.Contains("'") Or Result.Contains("""") Then If Not Regex.IsMatch(Result, "^'|'$") Then '... Todo este contenido se lo salta D: Else MsgBox(Result) End If Else MsgBox(Result) End If
Que puedo hacer? D:
He probado a poner: 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... For Each Result As String In Line.Split(",") If Regex.IsMatch(Result, "'") Or Regex.IsMatch(Result, """") Then MsgBox("Esta cadena contiene "" o ' en su interior...") If Not Regex.IsMatch(Result, "^'|'$") Then MsgBox("Esta cadena contiene "" o ' en su interior...3") MsgBox("Error", MsgBoxStyle.Critical, "Error") Else MsgBox("Esta cadena contiene "" o ' en su interior...2") If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then MsgBox("Esta cadena contiene "" o ' en su interior...5") MsgBox(Result) Else MsgBox("Esta cadena contiene "" o ' en su interior...6") MsgBox("Error", MsgBoxStyle.Critical, "Error") End If End If Else MsgBox(Result) 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: If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0Then MsgBox("Esta cadena contiene "" o ' en su interior...5") MsgBox(Result) Else MsgBox("Esta cadena contiene "" o ' en su interior...6") MsgBox("Error", MsgBoxStyle.Critical, "Error") End If
Por esto: If Not CountCharacter(Result, "'") Or CountCharacter(Result, """") Mod 2 = 0 Then MsgBox("Esta cadena contiene "" o ' en su interior...6") MsgBox("Error", MsgBoxStyle.Critical, "Error") Else MsgBox("Esta cadena contiene "" o ' en su interior...5") MsgBox(Result) 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
Mensajes: 9.866
|
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 CaseYo 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
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
Pues intenta no escribir if's anidados... -> Select CaseTe 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/Siy0gK67Puedes ver lo que pasa... ¿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. ¿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
Select Case Result Case Regex.IsMatch(Result, "^'|'$") = False Or Regex.IsMatch(Result, "^""|""$") = False MsgBox("Error: #1") Case CountCharacter(Result, "'") Mod 2 = True Or CountCharacter(Result, """") Mod 2 = True MsgBox("Error: #2") Case Else MsgBox(Result) 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
Mensajes: 9.866
|
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
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
¿Hay que escapar cualquier comilla que esté dentro de la primera y última comilla... Hay le has dao. ...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.. 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
Mensajes: 9.866
|
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: Public Class Form1 Dim strarray() As String = _ "NULL,'Correcto','mal,NULL,''mal'',NULL,'mal'',NULL,''mal',mal',NULL".Split(",") Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown For Each value In strarray Select Case True Case value.StartsWith("'") AndAlso value.EndsWith("'") MsgBox(String.Format("'{0}'", value.Substring(1, value.Length - 2).Replace("'", "\'"))) Case value.StartsWith("'") AndAlso Not value.EndsWith("'") MsgBox(value.Replace("'", "\'")) Case value.EndsWith("'") AndAlso Not value.StartsWith("'") MsgBox(value.Replace("'", "\'")) Case Else MsgBox(value) End Select Next value End Sub End Class
Saludos...
|
|
« Última modificación: 2 Agosto 2013, 23:34 pm por EleKtro H@cker »
|
En línea
|
|
|
|
z3nth10n
Desconectado
Mensajes: 1.583
"Jack of all trades, master of none." - Zenthion
|
Ala con la tontería me has hecho la app... For Each Result As String In Regex.Split(Line, ",|\n") Select Case True Case Result.StartsWith("'") AndAlso Result.EndsWith("'") MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'"))) Case Result.StartsWith("'") AndAlso Not Result.EndsWith("'") MsgBox(Result & "'") Case Result.EndsWith("'") AndAlso Not Result.StartsWith("'") MsgBox("'" & Result) Case Else MsgBox(Result) End Select Next Result
Ahora ya solo me falta enumerar los errores y varias cosillas más pa meterlas en un Log... (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... Por cierto, se me olvidaba... ¡Muchas gracias!
Tengo una mini-duda... 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 Estoy modo l33t no te puedo fallar. Ya lo he arreglado con: Select Case True Case Result.StartsWith("'") AndAlso Result.EndsWith("'") MsgBox(String.Format("'{0}'", Result.Substring(1, Result.Length - 2).Replace("'", "\'"))) Case Result.StartsWith("'") AndAlso Not Result.EndsWith("'") MsgBox(Result & "'") Case Result.EndsWith("'") AndAlso Not Result.StartsWith("'") MsgBox("'" & Result) '----------------------- Case Result.StartsWith("""") AndAlso Result.EndsWith("""") MsgBox(String.Format("""{0}""", Result.Substring(1, Result.Length - 2).Replace("""", "\"""))) Case Result.StartsWith("""") AndAlso Not Result.EndsWith("""") MsgBox(Result & """") Case Result.EndsWith("""") AndAlso Not Result.StartsWith("""") MsgBox("""" & Result) Case Else MsgBox(Result) 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
Mensajes: 9.866
|
buscar la String original y sustituirla por la nueva dentro de un archivo... -> .ReplaceMsgBox(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.FormatEn 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[SOURCE] RegEx .NET
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
3
|
4,077
|
11 Septiembre 2013, 16:53 pm
por Eleкtro
|
|
|
[Solucionado]Duda con regex
« 1 2 »
Java
|
.:UND3R:.
|
14
|
7,683
|
26 Noviembre 2013, 21:05 pm
por .:UND3R:.
|
|
|
Orden de regex en java
Java
|
.:UND3R:.
|
2
|
1,911
|
26 Noviembre 2013, 23:35 pm
por .:UND3R:.
|
|
|
php no soporta regex complejo
PHP
|
franfis
|
6
|
3,245
|
30 Marzo 2014, 15:22 pm
por franfis
|
|
|
Ayuda con Regex
Programación General
|
BlackM4ster
|
0
|
1,808
|
19 Abril 2014, 14:17 pm
por BlackM4ster
|
|