Cree una función de reemplazo para cadenas en Delphi
Nota del editor: de hecho, la función StringReplace de Delphi está diseñada específicamente para satisfacer esta necesidad. Pero también publicamos este artículo; al menos el autor ofrece una alternativa y se debe fomentar el espíritu de exploración. Este es mi primer artículo aquí, y como mi nivel no es muy alto, trataré un tema básico pero muy práctico, espero que les pueda servir de ayuda. Los amigos que han usado VB o ASP saben que existe una función de reemplazo muy práctica en VB. Su función es reemplazar la cadena que coincide con la subcadena (también llamada cadena de patrón) en una cadena con la cadena especificada. Por ejemplo, existe una cadena de este tipo: s:='apple is apple!'. Después de usar la función de reemplazo para reemplazar (s,'apple','box'), s se convierte en 'box is box!'. La longitud de la cuerda también cambia en consecuencia. Esta es una función muy útil. Todo el mundo sabe que las declaraciones de consulta estructuradas SQL se utilizan a menudo al desarrollar sistemas de bases de datos, y esta declaración es sensible a algunos caracteres, como las comillas simples. Si aparecen comillas simples en las comillas de la declaración SQL. se utilizan en cuadrados l) El programa causará errores inesperados e incluso puede ser utilizado por otros para causar graves vulnerabilidades de seguridad en el sistema (este es el famoso ataque de inyección SQL, creo que todos todavía recuerdan lo que descubrió el foro CSDN antes) Esta es una laguna ). En este momento, debe reemplazar las comillas simples con otras cadenas o cadenas vacías durante las operaciones de la base de datos y luego reemplazarlas nuevamente al leer los datos, para que las comillas simples se puedan registrar en el registro de datos sin errores. Sin embargo, no encontré una función similar en Delphi (¿tal vez no la encontré?), Lo cual fue realmente inconveniente, así que escribí una yo mismo, que será mucho más conveniente en el desarrollo futuro del sistema de base de datos. Después de decir tantas tonterías, aquí está el código, debería ser más fácil de entender con comentarios.
Procedimiento replace(var s:string;const SourceChar:pchar;const RChar:pchar); // El primer parámetro es la cadena original, el segundo es la cadena del patrón y el tercero es la cadena de reemplazo var ta,i,j: entero; m,n,pn,sn:entero; SLen,SCLen,RCLen:integer;// SLen representa la longitud de la cadena original, SCLen representa la longitud pasada por el modo, RCLen representa la longitud de la cadena de reemplazo IsSame:integer; newp:array of char;// Solía para guardar la matriz de caracteres reemplazada comenzar SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar); j:=pos(string(SourceChar),s); s:=s+chr(0);ta:=0;i:=j; while s[i]<>chr(0) do // Este bucle usa ta cuenta el número de veces que aparece la cadena de patrón en la cadena original comenzar n:=0;IsSame:=1; para m:=i a i+SCLen-1 comience si m>SLen luego comience IsSame:=0;break ; fin; si s[m]<>sourceChar[n] luego comienza IsSame:=0;break; n:=n+1; si IsSame=1 entonces comienza ta:=ta+1;i:=m; i:=i+1; fin; si j>0 entonces comienza pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Asigne la longitud de newp, +1 significa que hay un terminador #0 detrás de él,
mientras que s[sn]<>chr(0) do // Principalmente bucle, comience a reemplazar start n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // Compare si la subcadena es la misma que la cadena del patrón comience si m>SLen luego comience IsSame
: =0;break; fin; si s[m]
< >sourceChar[n] entonces // Mismo comienzo para; m:=0 a RCLen-1 comienza newp [ pn]:=RChar[m];pn :=pn+
1 end ; // Diferente nuevop[pn]:=s[sn]; pn:=pn+1;sn:=sn+1; fin ; nuevop[pn]:=#0 ; / se reinicia , ¡reemplazo completado! fin; fin; De hecho, este es un problema básico de estructura de datos. Hoy en día, cuando programamos a menudo con controles de arrastrar y soltar, deberíamos simplemente practicar la estructura de datos. Por supuesto, esta función no está escrita de manera óptima. Probé reemplazando una cadena de 10,000 palabras y tomó medio segundo. La complejidad del tiempo aún es relativamente alta. Si tiene una manera mejor, ¡coméntela!