Crie uma função de substituição para strings em Delphi
Nota do editor: Na verdade, a função StringReplace do Delphi foi projetada especificamente para atender a essa necessidade. Mas também publicamos este artigo - pelo menos o autor oferece uma alternativa, e o espírito de exploração deve ser encorajado! Este é meu primeiro artigo aqui, e como meu nível não é muito alto, vou abordar uma questão básica, mas muito prática, espero que possa lhe ajudar. Amigos que usaram VB ou ASP sabem que existe uma função de substituição muito prática em VB. Sua função é substituir a string que corresponde à substring (também chamada de string padrão) em uma string pela string especificada. Por exemplo, existe uma string: s:='apple is apple!' Depois de usar a função de substituição para substituir (s,'apple','box'), s torna-se 'box is box!'. O comprimento da string também muda de acordo. Esta é uma função muito útil. Todos sabem que as instruções de consulta estruturada sql são frequentemente usadas no desenvolvimento de sistemas de banco de dados, e esta instrução é sensível a alguns caracteres, como aspas simples. são usados em sq l) o programa causará erros inesperados, podendo até ser usado por terceiros para causar sérias vulnerabilidades de segurança no sistema (esse é o famoso ataque de injeção de SQL, acredito que todos ainda se lembram do que foi descoberto pelo fórum CSDN antes) Isso é uma brecha ). Neste momento, você precisa substituir as aspas simples por outras strings ou strings vazias durante as operações do banco de dados e, em seguida, substituí-las novamente ao ler os dados, para que as aspas simples possam ser registradas no registro de dados sem erros. No entanto, não encontrei uma função semelhante no Delphi (talvez não a tenha encontrado?), o que foi realmente inconveniente, então eu mesmo escrevi uma, que será muito mais conveniente no futuro desenvolvimento de sistemas de banco de dados. Depois de falar tanta bobagem, aqui está o código, deve ficar mais fácil de entender com comentários.
PRocedure replace(var s:string;const SourceChar:pchar;const RChar:pchar); // O primeiro parâmetro é a string original, o segundo é a string padrão e o terceiro é a string de substituição var ta,i,j: inteiro ; m,n,pn,sn:inteiro; SLen,SCLen,RCLen:integer;//SLen representa o comprimento da string original, SCLen representa o comprimento passado pelo modo, RCLen representa o comprimento da string de substituição IsSame:integer newp:array of char;// Usado para salve a matriz de caracteres substituída start 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 loop usa ta conta o número de vezes que a string padrão aparece na string original start n:=0;IsSame:=1; for m:=i to i+SCLen-1 do start if m>SLen then start IsSame:=0;break ; fim; se s[m]<>sourceChar[n] then start IsSame:=0;break; end n : =n+1; i:=i+1; fim se j>0 então começa pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Alocar o comprimento de newp, +1 significa que há um terminador #0 atrás dele
enquanto s[sn]<>chr(0) do // Principalmente Loop, comece substituindo start n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // Compare se a substring é igual à string padrão start if m>SLen then start IsSame:=0;break end; if s[m]<>sourceChar[n] então começar IsSame: = 0 ; break end ; m:=0 para RCLen-1 do start newp [ pn]:=RChar[m];pn:=pn + 1 ; // Diferente newp[pn]:=s[sn]; pn
: =pn+1;sn:=sn + 1 ; / resets , substituição concluída! fim; fim; Na verdade, esta é uma questão básica de estrutura de dados. Hoje, quando programamos frequentemente com controles de arrastar e soltar, deveríamos apenas praticar a estrutura de dados. Claro, esta função não foi escrita de maneira ideal. Testei a substituição de uma string de 10.000 palavras e demorou meio segundo. A complexidade do tempo ainda é relativamente alta. Se você tiver uma maneira melhor, discuta-a!