Delphi에서 문자열 대체 함수 만들기
편집자 주: 실제로 Delphi의 StringReplace 기능은 이러한 요구 사항을 충족하도록 특별히 설계되었습니다. 그러나 우리는 이 기사도 출판합니다. 최소한 저자는 대안을 제공하고 탐구 정신은 장려되어야 합니다! 이것은 나의 첫 번째 기사이며 내 수준이 그리 높지 않기 때문에 기본적이면서도 매우 실용적인 문제에 대해 논의하겠습니다. VB나 ASP를 사용해 본 친구들은 VB에 매우 실용적인 바꾸기 기능이 있다는 것을 알고 있습니다. 그 기능은 문자열의 하위 문자열(패턴 문자열이라고도 함)과 일치하는 문자열을 지정된 문자열로 바꾸는 것입니다. 예를 들어, s:='apple is apple!'과 같은 문자열이 있습니다. (s,'apple','box')를 바꾸기 위해 바꾸기 함수를 사용한 후 s는 'box is box!'가 됩니다. 그에 따라 문자열의 길이도 변경됩니다. 이것은 매우 유용한 기능입니다. 구조화된 쿼리 문 sql은 데이터베이스 시스템을 개발할 때 자주 사용되며, 이 문은 작은 따옴표와 같은 일부 문자에 민감합니다. 제곱에서 사용됩니다 l) 프로그램은 예상치 못한 오류를 일으키고 다른 사람이 시스템에 심각한 보안 취약성을 유발하기 위해 사용할 수도 있습니다. (이것은 유명한 SQL 주입 공격입니다. 이전에 CSDN 포럼에서 발견한 내용을 모두가 여전히 기억한다고 생각합니다.) 이것은 허점입니다. ). 이때, 데이터베이스 작업 시 작은따옴표를 다른 문자열이나 빈 문자열로 교체한 후, 데이터를 읽을 때 다시 교체해야 오류 없이 데이터 레코드에 작은따옴표가 기록될 수 있습니다. 그런데 델파이에서 비슷한 기능을 못찾아서(아마 제가 못찾은걸까요?) 정말 불편해서 제가 직접 작성했는데, 향후 데이터베이스 시스템 개발에 훨씬 편리할 것 같습니다. 말도 안되는 이야기를 많이 한 후에 코드는 다음과 같습니다. 주석을 사용하면 이해하기 더 쉬울 것입니다.
PRocedure replacement(var s:string;const SourceChar:pchar;const RChar:pchar); // 첫 번째 매개변수는 원래 문자열, 두 번째 매개변수는 패턴 문자열, 세 번째 매개변수는 대체 문자열입니다 .
var ta,i,j: 정수 ; m,n,pn,sn:정수; SLen,SCLen,RCLen:integer;//SLen은 원래 문자열의 길이를 나타내고, SCLen은 모드에서 전달된 길이를 나타내며, RCLen은 대체 문자열의 길이를 나타냅니다. IsSame :integer; newp:array of char;// 대체된 문자 배열을 저장합니다. 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 // 이 루프는 ta는 패턴 문자열이 원래 문자열에 나타나는 횟수를 계산합니다. start n:=0;IsSame:=1; for m:=i to i+SCLen-1 do start if m>SLen then start IsSame:=0;break ; 끝나면 s[m]<>sourceChar[n] then start IsSame:=0;break; end ; 만약 IsSame=1이면 start ta:=ta+1;i:=m ; 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 // 주로 루프 교체 시작 start n:=0;IsSame:=1; for m:=sn to sn+SCLen-1 do // 하위 문자열이 패턴 문자열과 동일한지 비교 m>SLen이면 시작 IsSame
: =0;break; if s[m]<>sourceChar[n] then start IsSame:=0;break ; if IsSame=
1 then// 동일 시작 m:=0 ~ RCLen-1 do start newp[pn]:=RChar[m];pn:=pn+1 ; end else start ; // 다름 newp[pn]:=s[sn]; pn :=pn+1;sn:=sn+1 ; end ; / 재설정 , 교체 완료! 끝; 끝 사실 이것은 기본적인 데이터 구조 문제입니다. 오늘날 우리는 드래그 앤 드롭 컨트롤로 프로그래밍을 자주 할 때 데이터 구조를 연습해야 합니다. 물론 이 함수는 최적으로 작성되지 않았습니다. 10,000 단어 문자열을 바꾸는 데 테스트를 거쳤는데 시간 복잡도가 여전히 높습니다. 더 좋은 방법이 있으면 논의해 주세요.