Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: "Dreckige" Zeichenkette bereinigen und kompilierbar machen

  Alt 6. Sep 2022, 16:17
Ich würde damit anfangen die Bedingug klar zu definieren und Testfälle aufzustellen.
Ist die Bedingung unvollständig oder falsch, kann auch das Ergebnis nicht in jedem Fall richtig sein.

Bedingung:
Im Text tritt diese Zeichenfolge auf:
[Buchstabe oder Ziffer][Hochkomma][beliebige Anzahl Leerzeichen(oder kein Leerzeichen)][Buchtstabe oder Ziffer]

Wenn Bedingung zutrifft, ersetze das Hochkomma durch zwei Hochkomma.
Die Bedingung kann an mehreren Stellen im Text auftreten.
Delphi-Quellcode:
uses
  StrUtils, WideStrUtils;

function IsBuchstabeOderZiffer(AValue: Char): Boolean;
begin
  Result := CharInSet(AValue, ['a'..'z', 'A'..'Z', '0'..'9']) or
            InOpArray(AValue, ['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü']);
end;

function HochkommaErgaenzen(const AValue: string): string;
const
  HOCHKOMMA = '''';
  SPACE = ' ';
var
  n1, n2, n3: Integer;
  c: Char;
begin
  Result := '';
  for n1 := 1 to Length(AValue) do
  begin
    c := AValue[n1];
    Result := Result + c;
    if IsBuchstabeOderZiffer(c) then
    begin
      {Hochkomma nach Buchstabe?}
      n2 := n1 + 1;
      if n2 <= Length(AValue) then
      begin
        c := AValue[n2];
        if c = HOCHKOMMA then
        begin
          {Leerzeichen nach Hochkomma überspringen}
          n3 := n2;
          repeat
            n3 := n3 + 1;
            if n3 <= Length(AValue) then
              c := AValue[n3]
            else
              c := #0;
          until c <> SPACE;
          {Buchstabe folgt Hochkomma (eventuelle nach Leerzeichen)}
          if IsBuchstabeOderZiffer(c) then
            Result := Result + HOCHKOMMA;
        end;
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat