Avatar billede hugopedersen Nybegynder
06. oktober 2008 - 15:27 Der er 12 kommentarer og
1 løsning

StringReplace - fjerne mellemrum

Kan man anvende StringReplace til at fjerne alle mellemrum på nær et i en streng?
Hvis jeg har en streng som f.eks.  1111  3 4  5  skal den blive til 1111 3 4 5
Avatar billede arne_v Ekspert
06. oktober 2008 - 15:31 #1
Tja. Hvis du erstatter to mellemrum med et mellemrum og bliver ved med at kalde
den indtil der ikke findes nogen, saa vil du opnaa det oenskede. Det er dog ikke
specielt effektivt.
Avatar billede vallemanden Nybegynder
06. oktober 2008 - 16:43 #2
nu er det lidt svært at se hvor du vil have fjernet det
men går ud fra at du '2 mellemrum' mellem 1 3 og 4 5?
Avatar billede vallemanden Nybegynder
06. oktober 2008 - 16:45 #3
s1 := '1111  3 4  5'
s2 := StringReplace(s1, '  ', ' ',[rfReplaceAll]);
Avatar billede vallemanden Nybegynder
06. oktober 2008 - 16:46 #4
hov mangler et ; i første linie
Avatar billede hugopedersen Nybegynder
06. oktober 2008 - 17:24 #5
vallemanden> hvis du ser på min tekst så vil du se at det jeg vil opnå er at fjerne alle mellemrum ud over 1 mellem hver parameter
1111...3.4..5  til  1111.3.4.5  (prikker for at vise mellemrum)

Det er parametre til et fjernestyringssystem og det sker at brugerne taster ekstra mellemrum ind i deres SMS besked og så har jeg balladen.
Avatar billede kroning Nybegynder
06. oktober 2008 - 17:42 #6
s1 := '1111        3    4  5'

while pos(#32#32,s1)>0 do
  s1:=StringReplace(s1, #32#32, #32,[rfReplaceAll]);
Avatar billede hrc Mester
06. oktober 2008 - 22:05 #7
repeat
  p := pos(#32#32,aString);
  if p > 0 then
    System.Delete(aString,p,1);
until p = 0;

Der findes også en variant af pos der har et offset så man ikke starter forfra hver gang - men til små strenge kan det ikke betale sig.
Avatar billede kroning Nybegynder
06. oktober 2008 - 23:13 #8
Hvis det er hastighed du har brug for så er denne metode hurtigere end pos og StringReplace metoden:

var
  i : integer;
begin
  i:=length(s);
  while i>1 do
  begin
    if (s[i]=#32) and (s[i-1]=#32) then
      Delete(s,i,1);
    dec(i);
  end;
end;
Avatar billede arne_v Ekspert
07. oktober 2008 - 04:47 #9
Hvis hastighed er vigtig så skal man undgå både StringReplace og Delete.

Noget a la:

function strip5(s : string) : string;

var
  tmp : string;
  i, ix : integer;

begin
  tmp := s;
  ix := 1;
  for i := 1 to length(s) do begin
    if (s[i] <> ' ') or ((i > 1) and (s[i-1] <> ' ')) then begin
      tmp[ix] := s[i];
      inc(ix);
    end;
  end;
  result := copy(tmp, 1, ix);
end;
Avatar billede hrc Mester
07. oktober 2008 - 11:44 #10
Nu mangler vi bare et BASM-eksempel.
Avatar billede bauerdata Nybegynder
07. oktober 2008 - 11:58 #11
Bare for sjov skyld i python.
s1 = '1111  3 4  5'
print " ".join(str.split())
1111 3 4 5
Avatar billede hugopedersen Nybegynder
13. oktober 2008 - 07:51 #12
Der er et eller andet galt her - jeg har sendt en kommentar og bedt arne_v om et svar da jeg endte med at bruge hans eksempel som udgangspunkt for min løsning, men den er da forsvundet igen.

Så arne_v du må gerne lægge et svar.
Avatar billede arne_v Ekspert
13. oktober 2008 - 14:13 #13
svar
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