إنشاء وظيفة استبدال للسلاسل في دلفي
ملاحظة المحرر: في الواقع، تم تصميم وظيفة StringReplace في دلفي خصيصًا لتلبية هذه الحاجة. ولكننا ننشر أيضًا هذه المقالة - على الأقل يقدم المؤلف بديلاً، ويجب تشجيع روح الاستكشاف! هذه هي مقالتي الأولى هنا، وبما أن مستواي ليس مرتفعًا جدًا، فسوف أناقش مسألة أساسية ولكن عملية جدًا وآمل أن أقدم لك بعض المساعدة. يعرف الأصدقاء الذين استخدموا VB أو ASP أن هناك وظيفة استبدال عملية جدًا في VB وتتمثل مهمتها في استبدال السلسلة التي تطابق السلسلة الفرعية (وتسمى أيضًا سلسلة النمط) في السلسلة بالسلسلة المحددة. على سبيل المثال، هناك مثل هذه السلسلة: s:='apple is apple!'. بعد استخدام وظيفة الاستبدال لاستبدال (s,'apple','box')، يصبح s 'box is box!'. يتغير طول السلسلة أيضًا وفقًا لذلك. هذه وظيفة مفيدة للغاية، يعلم الجميع أن عبارات الاستعلام المنظمة SQL تستخدم غالبًا عند تطوير أنظمة قواعد البيانات، وهذه العبارة حساسة لبعض الأحرف، مثل علامات الاقتباس المفردة في علامات الاقتباس المفردة تستخدم في مربع ل) سيتسبب البرنامج في حدوث أخطاء غير متوقعة، ويمكن حتى أن يستخدمه الآخرون لإحداث ثغرات أمنية خطيرة في النظام (هذا هو هجوم حقن SQL الشهير، وأعتقد أن الجميع ما زالوا يتذكرون ما اكتشفه منتدى CSDN من قبل) هذه ثغرة ). في هذا الوقت، تحتاج إلى استبدال علامات الاقتباس المفردة بسلاسل أخرى أو سلاسل فارغة أثناء عمليات قاعدة البيانات، ثم استبدالها مرة أخرى عند قراءة البيانات، بحيث يمكن تسجيل علامات الاقتباس المفردة في سجل البيانات دون أخطاء. ومع ذلك، لم أجد وظيفة مماثلة في دلفي (ربما لم أجدها؟)، الأمر الذي كان غير مريح حقًا، لذلك كتبت واحدة بنفسي، والتي ستكون أكثر ملاءمة في تطوير نظام قاعدة البيانات في المستقبل. بعد الحديث عن الكثير من الهراء، هذا هو الكود، يجب أن يكون من الأسهل فهمه من خلال التعليقات.
PROcedure استبدال(var s:string;const SourceChar:pchar;const RChar:pchar); // المعلمة الأولى هي السلسلة الأصلية، والثانية هي سلسلة النمط، والثالثة هي السلسلة البديلة var ta,i,j: عدد صحيح؛ م، ن، ن، سن: عدد صحيح؛ SLen,SCLen,RCLen:integer;// يمثل SLen طول السلسلة الأصلية، ويمثل SCLen الطول الذي تم تمريره بواسطة الوضع، ويمثل RCLen طول السلسلة البديلة IsSame:integer; newp:array of char;// يستخدم ل احفظ مصفوفة الأحرف المستبدلة وابدأ 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 تبدأ إذا m>SLen ثم تبدأ IsSame:=0;break ؛ نهاية ؛ s[m]<>sourceChar[n] ثم ابدأ IsSame:=0;break; n:=n+
1 ; end; i:=i+1; end; إذا j>0 فابدأ pn:=0;sn:=1; setlength(newp,SLen-ta*SCLen+ta*RCLen+1);// تخصيص طول newp، +1 يعني وجود فاصل #0 خلفه
بينما s[sn]<>chr(0) do // بشكل أساسي، ابدأ في استبدال begin n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // قارن ما إذا كانت السلسلة الفرعية هي نفس سلسلة النمط begin if m>SLen ثم begin IsSame:=0;break; end; إذا كان s[m]
< > sourceChar
[ n] يبدأ IsSame:=0;break; n:=n+ 1 ; m:=0 to RCLen-1 do begin newp[pn]:=RChar[m];pn:=pn+1 ; sn:=sn+SCLen end else begin ;
// مختلف newp[pn]:=s[sn]; sn :=sn+ 1 end ; / إعادة تعيين ، اكتمل الاستبدال! النهاية ؛ في الواقع، هذه مشكلة أساسية في بنية البيانات. اليوم، عندما نبرمج غالبًا باستخدام عناصر تحكم السحب والإفلات، يجب علينا فقط ممارسة بنية البيانات. بالطبع، لم تتم كتابة هذه الوظيفة على النحو الأمثل، لقد اختبرت استبدال سلسلة مكونة من 10000 كلمة واستغرق الأمر نصف ثانية، ولا يزال التعقيد الزمني مرتفعًا نسبيًا.