AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suche StringReplace mit Widestrings

Ein Thema von xaromz · begonnen am 3. Jun 2005 · letzter Beitrag vom 6. Jun 2005
Antwort Antwort
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#1

Suche StringReplace mit Widestrings

  Alt 3. Jun 2005, 20:25
Hallo,

ich suche (wie der Titel schon sagt) eine StringReplace-Funktion mit WideStrings. In der Code-Library ist ja ein Ersatz drin, der sich leicht anpassen lässt. Drunter sind aber auch Links zu besseren Funktionen, die aber nur mit AnsiStrings funktionieren. Ich habe leider keine Zeit, mich da einzuarbeiten und das anzupassen (Ich muss mich ja ums eigentliche Projekt kümmern).
Darum meine Frage: Hat jemand eine schnelle Funktion? Ach ja, ich brauch kein case sensitive.

Gruß
xaromz
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Suche StringReplace mit Widestrings

  Alt 3. Jun 2005, 21:27
Hallo xaromz,

wenn du nur den Ansi-kompatiblen Subset von Unicode verwendest, dann kannst du einfach auf die Auto-Konversion von WideStrings und AnsiStrings zurück greifen und die schönen Routinen aus StrUtils weiter verwenden - oder ist das jetzt zu einfach?

Grüße vom marabu
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Suche StringReplace mit Widestrings

  Alt 3. Jun 2005, 21:29
Hallo,

ich schreib grad 'ne Software, die auch in Asien verwendet werden soll. Ich brauch also wirklich WideStrings.

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#4

Re: Suche StringReplace mit Widestrings

  Alt 3. Jun 2005, 21:32
Ich hab mal so ne Frage, aber... was stört dich, wenn man einfach den Funktionskopf entsprechend ändert?

function ConvertCharacters(aString, FromStr, ToStr: WideString): WideString; Bei meinem Test hat es funktioniert (WideString bearbeiten).
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Suche StringReplace mit Widestrings

  Alt 3. Jun 2005, 21:34
Hallo,

Zitat von malo:
Ich hab mal so ne Frage, aber... was stört dich, wenn man einfach den Funktionskopf entsprechend ändert?
Hab ich ja gemacht. Was mich stört, ist dass ich Strings mit einer Länge von mehreren MB habe und deshalb möglichst schnelle Routinen brauche.

Gruß
xaromz
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Suche StringReplace mit Widestrings

  Alt 6. Jun 2005, 09:01
Hallo,

sieht wohl so aus, als hätte ich doch Zeit mich damit zu beschäftigen; antworte ich mir eben selbst.

Delphi-Quellcode:
function StringReplace(const Source, OldPattern, NewPattern: WideString): WideString;
// Replace every occurrence, case insensitive
var
   C: Integer;
   FoundCount: Integer;
   SourcePosition: Integer;
   Positions: array of Integer;

   SourceLength, OldPatternLength, NewPatternLength: Integer;
   WideCharLength: Integer;
   Helper: Integer;

   PSource, PDest, PNew: PWideChar;
begin
  // Is there anything to do?
  if (OldPattern = NewPattern) or
     (Source = '') or
     (OldPattern = '') then
  begin
    Result := Source;
    Exit;
  end;

  // Initialize some variables
  SourceLength := Length(Source);
  OldPatternLength := Length(OldPattern);
  NewPatternLength := Length(NewPattern);
  WideCharLength := SizeOf(WideChar);

  FoundCount := 0;

  // We *should* range check here, but who has strings > 4GB ?
  SetLength(Positions, SourceLength div OldPatternLength + 1);

  Helper := OldPatternLength * WideCharLength;

  C := 1;
  while C <= SourceLength - OldPatternLength + 1 do
  begin
    if Source[C] = OldPattern[1] then // Check first char before we waste a jump to CompareMem
    begin
      if CompareMem(@Source[C], @OldPattern[1], Helper) then
      begin
        Positions[FoundCount] := C; // Store the found position
        Inc(FoundCount);
        Inc(C, OldPatternLength - 1); // Jump to after OldPattern
      end;
    end;
    Inc(C);
  end;

  if FoundCount > 0 then // Have we found anything?
  begin
    // We know the length of the result
    // Again, we *should* range check here...
    SetLength(Result, SourceLength + FoundCount * (NewPatternLength - OldPatternLength));

    // Initialize some variables
    SourcePosition := 1;
    PSource := PWideChar(Source);
    PDest := PWideChar(Result);
    PNew := PWideChar(NewPattern);
    Helper := NewPatternLength * WideCharLength;

    // Replace...
    for C := 0 to FoundCount - 1 do
    begin
      // Copy original and advance resultpos
      Move(PSource^, PDest^, (Positions[C] - SourcePosition) * WideCharLength);
      Inc(PDest, Positions[C] - SourcePosition);

      // Append NewPattern and advance resultpos
      Move(PNew^, PDest^, Helper);
      Inc(PDest, NewPatternLength);

      // Jump to after OldPattern
      Inc(PSource, Positions[C] - SourcePosition + OldPatternLength);
      SourcePosition := Positions[C] + OldPatternLength;
    end;
    // Append characters after last OldPattern
    Move(PSource^, PDest^, (SourceLength - SourcePosition + 1) * WideCharLength);
  end else
    Result := Source; // Nothing to replace

  // Clean up
  Finalize(Positions);
end;
Bisher schneller als alles, was ich gefunden hab. Vermutlich kann das aber jemand noch verbessern (Freiwillige vor ).

Gruß
xaromz

//Edit: Kleinen Fehler beseitigt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz