Avatar billede r9 Nybegynder
22. februar 2003 - 21:43 Der er 9 kommentarer og
6 løsninger

Fjerne tegn fra en String

Jeg har en String som jeg ønsker at fjerne ulovlige tegn fra.

str := 'deghj544=dfvdfvjk#hjkhjka!';

=,# og ! er ulovlige.

Det er i sig selv ikke noget problem at fjerne de ulovlig tegn, men jeg ønsket at angive ALLE mine Ulovlige tegn som en mængde, og der udfra køre stringen igennem mængden, og fjerne alle ulovlige tegn.

Men hvordan?
Avatar billede r9 Nybegynder
22. februar 2003 - 22:04 #1
noget ala:

UlovligeTegn : array[1..8] of String = ('\', '/' , ':' ,'?' , '""' , '<' , '>', '|');

str := '/\deghj544=dfvdfvjk#hjkhjka!';

     
  for i := 0 to Length(UlovligeTegn) do
    if UlovligeTegn[i] = str then
      Delete(str, ?, ?);



Hvordan får jeg index'et på hvor tegnet er i stringen?
Avatar billede cooljay2000 Nybegynder
22. februar 2003 - 23:31 #2
Brug et regular expression library.

Så kan du:
strUdenUlovligeTegn:=ReplaceRegExpr('[\=\#\!]',str,'');
Avatar billede hermandsen Juniormester
22. februar 2003 - 23:39 #3
S := StringReplace(S, '=', '', rfReplaceAll);
S := StringReplace(S, '#', '', rfReplaceAll);
S := StringReplace(S, '!', '', rfReplaceAll);
Avatar billede doctorseb Nybegynder
23. februar 2003 - 15:48 #4
for I := 1 to Length(S) do
  if S[I] in ['=', '#', '!'] then
    Delete(S, I, 1);

Hvis du bekymrer dig bare lidt om performance, kan det være en fordel at kopiere strengen ud til en anden preallokeret i stedet for at slette tegn enkeltvis...
Hvis du bekymrer dig
Avatar billede eht Nybegynder
23. februar 2003 - 15:48 #5
Prøv denne

procedure TForm1.Button1Click(Sender: TObject);
const
  UlovligeTegn = (['=', '#', '!']);
var
  i:integer;
  str:string;
begin
str := '!!deghj544=dfvdfvjk#hjkhjka!';
for i := length(str) downto 1 do
if str[i] in UlovligeTegn then delete(str,i,1);
showmessage(str);
end;
Avatar billede doctorseb Nybegynder
23. februar 2003 - 15:49 #6
Avs... vend lige løkke om:
for I := Length(S) downto 1 do
...
Avatar billede eht Nybegynder
23. februar 2003 - 15:55 #7
Ups!! Foregående var et svar.

Kommentar:
Som du ser benytter jeg "downto" for at løbe "str" igennem bagfra. Det har den fordel at alle tegnene bliver checket. Det sker ikke ved "i := 1 to" hvis et tegn bliver slettet, skifter alle efterfølgende tegn jo et nummer og det efterfølgende tegn bliver sprunget over.
Avatar billede doctorseb Nybegynder
23. februar 2003 - 16:00 #8
eht -> ja, og man banker hovedet mod en GPF, avavavavavav :]
Avatar billede hermandsen Juniormester
23. februar 2003 - 19:19 #9
Bare lige et spørgsmål til alle der har forslået String[Index]-koden...

Hvad gør i hvis strengen er længere end 255 tegn!? Så virker jeres løkke nemlig ikke! :)
Avatar billede doctorseb Nybegynder
23. februar 2003 - 19:35 #10
hermandsen -> Nej, ikke hvis du bruger Delphi 1. Ellers gør den...
Avatar billede hermandsen Juniormester
23. februar 2003 - 20:13 #11
Hmmm... Der skulle jeg da vist lige ha' opdateret min Delphi-viden... Var ellers ret sikker på at den kun måtte være 255 Chars lang så... :)

Nå, lige meget... Tror heller ikke det er performance-mæssigt godt at gøre det på den måde alligevel! ;)
Avatar billede dcgeek Nybegynder
24. februar 2003 - 14:18 #12
procedure TForm1.FormCreate(Sender: TObject);
var i : integer;
    s : string;
    UlovligeTegn : array[1..3] of string;

begin
  UlovligeTegn[1] := '=';
  UlovligeTegn[2] := '/';
  UlovligeTegn[3] := '%';
  //Osv. osv. osv.
 
  for i := 1 to 3 do
  s := StringReplace(s, UlovligeTegn[i], '', rfReplaceAll);

end;
Avatar billede athlon-pascal Juniormester
25. februar 2003 - 19:26 #13
procedure FjernUlovligeTegn(UlovligeTegn: String; var Str: String);
var
  I: Integer;
  tmpStr: String;
begin
  UlovligeTegn := AnsiUpperCase(UlovligeTegn);
  tmpStr := '';
  for I := 1 to Length(Str) do
    if Pos(AnsiUpperCase(Str[I]), UlovligeTegn) < 1 then
      tmpStr := tmpStr + Str[I];
  Str := tmpStr;
end;
Avatar billede athlon-pascal Juniormester
25. februar 2003 - 19:30 #14
Eksempel:
var
  Str = String;
begin
  Str := 'deghj544=dfvdfvjk#hjkhjka!';
  FjernUlovligeTegn('=#!', Str);
  ShowMessage(Str);
end;

Hvis det ikke virker helt er det fordi jeg ikke har testet :-)
Avatar billede athlon-pascal Juniormester
25. februar 2003 - 19:30 #15
var
  Str = String;

skal naturligvis erstattes med

var
  Str: String;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester