[Ayuda] Comprobar Símbolos en un string.

Iniciado por **Aincrad**, 1 Noviembre 2019, 22:42 PM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

Hola, hoy vengo con una duda. Como podría comprobar sin un string contiene símbolos?

Ejemplo :

Dim Cadena as string = "asd)$%&"·!"·"

If ContainsSimbols(Cadena) = True Then
       
End If


En este caso los simbolos que quiero detectar son algo como estos :





Serapis

El modo más simple... usando un bucle.
Donde o bien examinas cada carácter en la cadena a probar contra la cadena de caracteres 'buscados', o cara carácter buscado contra la cadena de entrada...



dim buscados as string = "xyz+-*/"
dim textoA as string = "buenos días y disfruten del desayuno"
dim textoB as string = "La ciudad no duerme"


ejemplo:

buleano = funcion ContieneAlgunCaracter(string buscados, string texto)
    bucle por cada caracter en buscados
        si texto.Contains(caracter) devolver TRUE
    fin bucle
    devolver FALSE
fin funcion


Probando los textos de ejemplo con la función:

Si ContieneAlgunCaracter(buscados, textoA)
  mensaje "El texto: """ + textoA + """ contiene algún carácter de estos: """ + buscados + ""
si no
  mensaje "El texto: """ + textoA + """ no contiene ningún carácter de la lista..."
fin si

Si ContieneAlgunCaracter(buscados, textoB)
   mensaje "El texto: """ + textoB + """ contiene algún carácter de estos: """ + buscados + ""
si no
  mensaje "El texto: """ + textoB + """ no contiene ningún carácter de la lista..."
fin si


Salida:
El texto: "buenos días y disfruten del desayuno" contiene algún carácter de estos: "xyz+-*/"

El texto: "La ciudad no duerme" no contiene ningún carácter de la lista...

Fíjate que si en la función intercambias los parámetros de los textos entre sí, sigue funcionando, sucede lo que decía en el párrafo al comienzo.

Si el texto prohibido-buscado será inalterable en el tiempo y muy buscado, es más rentable generar un array de reconocimiento, si bien es más costoso los preparativos, es más rápido su uso, porque solo requiere recorrer la cadena donde se busca, no las dos:

array de bytes/chars TblBuscados(0 a 255)
funcion CrearTabla(string Buscados)
   ' Si el texto no es fino, si no mutable en el tiempo, requiere un 'reset' previo de la tabla
    bucle para k desde 0 hasta 255
        TblBuscados(k) = 0
    siguiente

    bucle por cada caracter en buscados
        TblBuscados(caracter) = 1
    siguiente
fin funcion


La misma función de antes, pero ahora le basta como parámetro el texto que se quiere revisar...

buleano = funcion ContieneAlgunCaracter(string texto)
    por cada caracter en texto
        si TblBuscados(caracter) = 1 Devolver TRUE
    siguiente
    devolver FALSE
fin funcion


Este segundo método es mucho más rápido, si bien su preparativo es algo más largo y exige dos funciones... es útil cuando se usa con mucha frecuencia o los 'símbolos' prohibidos-exigidos que se buscan, no cambian con cada búsqueda.
Nota que métodos como 'Contains' aunque se invocan de forma atómica, en realidad son bucles pués exige recorrer el texto para ver si contiene el texto que se busca. Las líneas de código son básicamente las mismas las instrucciones del procesador en cambio no.

ThunderCls

Supongo que IndexOfAny haria el trabajo, si estas usando VB.NET seria algo como

Código (vbnet) [Seleccionar]
Dim Cadena as string = "tu cadena iria aqui"
' especificas los simbolos que deseas buscar
Dim sSimbolos() as String;

If Cadena.IndexOfAny(sSimbolos) = 0 Then
  ' Simbolos encontrados
  ' ...
Else
  ' Simbolos no encontrados
  ' ...
End If
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/