Delphi で文字列の置換関数を作成する
編集者注: 実際、Delphi の StringReplace 関数は、このニーズを満たすために特別に設計されています。しかし、私たちはこの記事も公開しています - 少なくとも著者は代替案を提供しており、探求の精神が奨励されるはずです。今回は初めての記事であり、私のレベルはそれほど高くないため、基本的ですが非常に実践的な問題について説明します。少しでもお役に立てれば幸いです。 VB または ASP を使用したことのある友人は、VB に非常に実用的な置換関数があることを知っています。その機能は、文字列内の部分文字列 (パターン文字列とも呼ばれます) に一致する文字列を指定された文字列に置き換えることです。たとえば、次のような文字列があります: s:='apple is apple!'。replace 関数を使用して (s,'apple','box') を置き換えると、s は 'box is box!' になります。それに応じて文字列の長さも変わります。これは非常に便利な関数です。構造化クエリ ステートメント SQL はデータベース システムの開発時によく使用されることを誰もが知っています。このステートメントは、SQL ステートメント内に単一引用符が含まれている場合など、一部の文字に影響を受けます。平方メートルで使用されますl) プログラムは予期しないエラーを引き起こし、システムに重大なセキュリティ脆弱性を引き起こすために他の人によって使用される可能性もあります (これは有名な SQL インジェクション攻撃です。以前 CSDN フォーラムによって発見されたことを誰もがまだ覚えていると思います) これは抜け穴です)。このとき、一重引用符をエラーなくデータ レコードに記録できるように、データベース操作中に一重引用符を他の文字列または空の文字列に置き換え、データを読み取るときに元に戻す必要があります。 しかし、Delphi には同様の機能が見つからず(見つけられなかったのか?)、非常に不便だったので、自分で書いてみたところ、今後のデータベースシステム開発においては、より便利になると思います。くだらない話をした後、コードを次に示します。コメントを付けたほうが理解しやすいはずです。
PROcedure replace(var s:string;const SourceChar:pchar;const RChar:pchar); //最初のパラメータは元の文字列、2 番目はパターン文字列、3 番目は置換文字列です。整数 ; m、n、pn、sn:整数; SLen,SCLen,RCLen:integer;//SLen は元の文字列の長さを表し、SCLen はモードによって渡された長さを表し、RCLen は置換文字列の長さを表します。IsSame :integerの newp:array;//に使用されます。置換された文字配列を保存します。 begin 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 //このループはta は、パターン文字列が元の文字列に出現する回数をカウントしますbegin n:=0;IsSame:=1; for m:=i to i+SCLen-1 do begin if m>SLen then begin IsSame:=0;break ; 終了する場合s[m]<>sourceChar[n] then begin IsSame:=0; end; n :=n+1 if IsSame=1; i:=m; i:=i+1; j >0 の場合は開始pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// newp の長さを割り当てます。+1 は、s[sn]<>chr(0) が実行中にその後ろに
#0ターミネータがあることを意味します
//主にループ、置換開始begin n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do //部分文字列がパターン文字列と同じかどうかを比較begin if m>SLen then begin IsSame:=0;break; end; if s[m]
< >
sourceChar [ n] then begin IsSame:=0; end ; if IsSame=1 then// m:=0 から RCLen-1 do begin newpn :=RChar[m];pn:=pn+1 end ; sn :=sn+SCLen; //異なるnewp[pn]:=s[sn]; pn :=pn+1;sn:=sn+1 ; s:=string
( newp); /リセット、交換完了!終わり;終わり;実際、これは基本的なデータ構造の問題であり、ドラッグ アンド ドロップ コントロールを使用してプログラミングすることが多い今日では、データ構造を練習するだけで十分です。もちろん、この関数は最適に記述されているわけではありません。10,000 ワードの文字列を置換するのに 0.5 秒かかりました。もっと良い方法がある場合は、議論してください。