2010-03-16 6 views
1

다음 코드를 가지고 있으며 모든 영숫자가 아닌 문자를 제거해야합니다. 델파이 2009에서 작동하지 않습니다.Delphi 2009 - 문자열에서 영숫자가 아닌 숫자를 뺍니다.

unit Unit2; 
//Used information from 
// http://stackoverflow.com/questions/574603/what-is-the-fastest-way-of-stripping-non-alphanumeric-characters-from-a-string-in 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 
Type 
    TExplodeArray = Array Of String; 

    TForm2 = class(TForm) 
    Memo1: TMemo; 
    ListBox1: TListBox; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    Function Explode (Const cSeparator, vString : String) : TExplodeArray; 
    Function Implode (Const cSeparator : String; Const cArray : TExplodeArray) : String; 
    Function StripHTML (S : String) : String; 
    function allwords(data:string):integer; 
    end; 

var 
    Form2: TForm2; 
    allword, allphrase: TExplodeArray; 

implementation 
{$R *.dfm} 
Function TForm2.StripHTML (S : String) : String; 
Var 
    TagBegin, TagEnd, TagLength : Integer; 
Begin 
    TagBegin := Pos ('<', S);  // search position of first < 

    While (TagBegin > 0) Do 
      Begin // while there is a < in S 
      TagEnd := Pos ('>', S);    // find the matching > 
      TagLength := TagEnd - TagBegin + 1; 
      Delete (S, TagBegin, TagLength);  // delete the tag 
      TagBegin := Pos ('<', S);   // search for next < 
      End; 

    Result := S;     // give the result 
End; 
Function TForm2.Implode (Const cSeparator : String; Const cArray : TExplodeArray) : String; 
Var 
    i : Integer; 
Begin 
    Result := ''; 
    For i := 0 To Length (cArray) - 1 Do 
      Begin 
      Result := Result + cSeparator + cArray [i]; 
      End; 
    System.Delete (Result, 1, Length (cSeparator)); 
End; 

Function TForm2.Explode (Const cSeparator, vString : String) : TExplodeArray; 
Var 
    i : Integer; 
    S : String; 
Begin 
    S := vString; 
    SetLength (Result, 0); 
    i := 0; 
    While Pos (cSeparator, S) > 0 Do 
      Begin 
      SetLength (Result, Length (Result) + 1); 
      Result[i] := Copy (S, 1, Pos (cSeparator, S) - 1); 
      Inc (i); 
      S := Copy (S, Pos (cSeparator, S) + Length (cSeparator), Length (S)); 
      End; 
    SetLength (Result, Length (Result) + 1); 
    Result[i] := Copy (S, 1, Length (S)); 
End; 
//Copied from JclStrings 
function StrKeepChars(const S: AnsiString; const Chars: TSysCharSet): AnsiString; 
var 
    Source, Dest: PChar; 
begin 
    SetLength(Result, Length(S)); 
    UniqueString(Result); 
    Source := PChar(S); 
    Dest := PChar(Result); 
    while (Source <> nil) and (Source^ <> #0) do 
    begin 
    if Source^ in Chars then 
    begin 
     Dest^ := Source^; 
     Inc(Dest); 
    end; 
    Inc(Source); 
    end; 
    SetLength(Result, (Longint(Dest) - Longint(PChar(Result))) div SizeOf(AnsiChar)); 
end; 
function ReplaceNewlines(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> {greater than less than} #0 do begin 
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin 
     DestPtr[0] := '\'; 
     DestPtr[1] := 't'; 
     Inc(SrcPtr); 
     Inc(DestPtr); 
    end else 
     DestPtr[0] := SrcPtr[0]; 
    Inc(SrcPtr); 
    Inc(DestPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 
function StripNonAlphaNumeric(const AValue: string): string; 
var 
    SrcPtr, DestPtr: PChar; 
begin 
    SrcPtr := PChar(AValue); 
    SetLength(Result, Length(AValue)); 
    DestPtr := PChar(Result); 
    while SrcPtr <> #0 do begin 
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin 
     DestPtr[0] := SrcPtr[0]; 
     Inc(DestPtr); 
    end; 
    Inc(SrcPtr); 
    end; 
    SetLength(Result, DestPtr - PChar(Result)); 
end; 
function TForm2.allwords(data:string):integer; 
var i:integer; 
begin 
    listbox1.Items.add(data); 
    data:= StripHTML (data); 
    listbox1.Items.add(data); 
    ////////////////////////////////////////////////////////////// 
    data := StrKeepChars(data, ['A'..'Z', 'a'..'z', '0'..'9']); 
    // Strips out everything data comes back blank in Delphi 2009 
    ////////////////////////////////////////////////////////////// 
    listbox1.Items.add(data); 
    data := stringreplace(data,' ',' ', [rfReplaceAll, rfIgnoreCase]); 
    //Replace two spaces with one. 
    listbox1.Items.add(data); 
    allword:= explode(' ',data); 
{ // Converting the following PHP code to Delphi 
    $text = ereg_replace("[^[:alnum:]]", " ", $text); 
    while(strpos($text,' ')!==false) $text = ereg_replace(" ", " ", $text); 
    $text=$string=strtolower($text); 
    $text=explode(" ",$text); 
    return count($text); 
} 
for I := 0 to Length(allword) - 1 do 
listbox1.Items.Add(allword[i]); 
end; 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
//[^[:alnum:]] 

allwords(memo1.Text); 
end; 

end. 

다른 방법으로이 작업을 수행할까요?

답변

1

Uses StrUtils; //StuffString 

var 
    Regex: TPerlRegEx; 
    I:Integer; 
begin 
Regex := TPerlRegEx.Create(nil); 
Regex.RegEx := '[^[:alnum:]]'; 
Regex.Options := [preMultiLine]; 
Regex.Subject := data; 
if Regex.Match then begin 
    repeat 
    data := StuffString(data,Regex.MatchedExpressionOffset,Regex.MatchedExpressionLength,' '); 
    until not Regex.MatchAgain; 
end; 
1

가장 쉬운 솔루션은 입력 문자열에서 알파 문자가 아닌 문자를 제외한 정규식을 정의하는 것입니다.

+0

예, 저는 TPerlRegEx와 함께 RegEx [^ [: alnum :]]를 사용하려고했지만 올바르게 사용하는 방법을 알지 못합니다. [^ [: alnum :]] 완벽하게 작동합니다. – Brad

+0

글쎄, 나는 당신의 제안을 RegEx와 함께 사용하고 그것을 몇 시간 후에 알아 냈다! – Brad

1

Delphi에서 많은 작업을 한 지 꽤 오래되었습니다. 버전 5는 내 놀이터였습니다.

Delphi 2009의 기본 기능 중 하나가 아닌, 현재 유니 코드입니다.

이것은 문자 단위로 처리하려고하는 모든 것에 영향을 미칩니다. 그것은 당신의 문제의 근원 일 수 있습니까?

관련 문제