Buat fungsi ganti untuk string di Delphi
Catatan Editor: Faktanya, fungsi StringReplace Delphi dirancang khusus untuk memenuhi kebutuhan ini. Namun artikel ini juga kami terbitkan - setidaknya penulis memberikan alternatif, dan semangat eksplorasi harus digalakkan! Ini adalah artikel pertama saya di sini, dan karena level saya tidak terlalu tinggi, saya akan membahas masalah mendasar namun sangat praktis. Saya harap ini dapat membantu Anda. Teman-teman yang pernah menggunakan VB atau ASP pasti tahu bahwa di VB ada fungsi replace yang sangat praktis, fungsinya untuk mengganti string yang cocok dengan substring (disebut juga pattern string) dalam sebuah string dengan string yang ditentukan. Misalnya, ada string seperti ini: s:='apple is apple!'. Setelah menggunakan fungsi replace untuk mengganti (s,'apple','box'), s menjadi 'box is box!'. Panjang string juga berubah. Ini adalah fungsi yang sangat berguna. Semua orang tahu bahwa pernyataan kueri terstruktur sql sering digunakan ketika mengembangkan sistem database, dan pernyataan ini sensitif terhadap beberapa karakter, seperti tanda kutip tunggal. Jika tanda kutip tunggal muncul dalam tanda kutip pernyataan sql (karena tanda kutip tunggal digunakan dalam persegi l) program akan menyebabkan kesalahan yang tidak terduga, dan bahkan dapat digunakan oleh orang lain untuk menyebabkan kerentanan keamanan yang serius pada sistem (ini adalah serangan injeksi SQL yang terkenal, saya yakin semua orang masih ingat apa yang ditemukan oleh forum CSDN sebelumnya) Ini adalah celah ). Saat ini, Anda perlu mengganti tanda kutip tunggal dengan string lain atau string kosong selama operasi database, lalu menggantinya kembali saat membaca data, sehingga tanda kutip tunggal dapat dicatat dalam catatan data tanpa kesalahan. Namun, saya tidak menemukan fungsi serupa di Delphi (mungkin saya tidak menemukannya?), yang sangat merepotkan, jadi saya menulisnya sendiri, yang akan jauh lebih nyaman dalam pengembangan sistem database di masa depan. Setelah berbicara banyak omong kosong, berikut kodenya, akan lebih mudah dipahami dengan komentar.
PROcedure replace(var s:string;const SourceChar:pchar;const RChar:pchar); // Parameter pertama adalah string asli, parameter kedua adalah string pola, dan parameter ketiga adalah string pengganti var ta,i,j: bilangan bulat; m,n,pn,sn:bilangan bulat; SLen,SCLen,RCLen:integer;//SLen mewakili panjang string asli, SCLen mewakili panjang yang dilewati oleh mode, RCLen mewakili panjang string pengganti IsSame:integer; simpan array karakter yang diganti mulai 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) melakukan // Perulangan ini menggunakan ta menghitung berapa kali string pola muncul dalam string asli mulai n:=0;IsSame:=1; untuk m:=i hingga i+SCLen-1 lakukan mulai jika m>SLen lalu mulai IsSame:=0;break ; akhir; jika s[m]<>sourceChar[n] lalu mulai IsSame:=0;break; end; n :=n+1 ; akhiri yang lain; i:=i+1; akhir; jika j>0 maka mulai pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// Alokasikan panjang newp, +1 berarti ada terminator #0 di belakangnya
sementara s[sn]<>chr(0) melakukan // Terutama Loop, mulailah mengganti mulai n:=0;IsSame:=1; untuk m:=sn ke sn+SCLen-1 do // Bandingkan apakah substringnya sama dengan string pola yang dimulai jika m>SLen lalu mulai IsSame:=0;break; end; jika s[m]
< > sourceChar[n] maka
mulai IsSame:=0;break; akhir ; m:=0 hingga RCLen-1 mulai newp[pn]:=RChar[m];pn:=pn + 1 ; end ; // Berbeda newp[pn]:=s[sn]; pn:=pn+1;sn:=sn+1; akhir ; newp[pn]:=#0 ; / reset , penggantian selesai! akhir ; Faktanya, ini adalah masalah struktur data dasar. Saat ini, ketika kita sering memprogram dengan kontrol drag-and-drop, kita sebaiknya mempraktikkan struktur data saja. Tentu saja fungsi ini belum ditulis secara maksimal. Saya menguji penggantian string 10.000 kata dan membutuhkan waktu setengah detik.Kompleksitas waktunya masih relatif tinggi.