Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Regulär bis zum abwinken (https://www.delphipraxis.net/69292-regulaer-bis-zum-abwinken.html)

colder 12. Mai 2006 23:35


Regulär bis zum abwinken
 
Hallo,

aus Gründen der flexibilität, habe ich mich für TRegExpr enschieden.
Im Moment habe ich allerdings das Gefühl, nicht umbedingt die richtige
Entscheidung getroffen zu haben. Was nicht an TRegExpr liegt sondern an mir.

Reguläre Ausdrücke - ein Buch mit sieben Sigeln.

Folgende zwei Sachen suche ich.


Delphi-Quellcode:
  Dim sFolder As String
 
   SetVars ()
   mssPath.SetConst (ccConstDir)

// Dieses TODO

/* TODO 1 -oDecke -cErledigen : Dies ist ein Todo mit einer Zeile */


  Select (GetOsLang ())
    Case (ccLangDE)
      sFolder = "Briefpapier"
      If (iCurrentVersion < 10)
        sFolder = "Stationery"
      EndIf
      If (iCurrentVersion = 10)
        sFolder = "Stationery"
      EndIf
    Default
      sFolder = "Stationery"
  EndSelect

// Dieses TODO

/* TODO 2 -oUschi -cBeachten :
Dies ist ein Todo
mit zwei zeilen. */

  If (cpStoring)
    Select (iCurrentVersion)
Mit folgender Expression bekomme ich schon mal das erste TODO (einzeilig) heraus
/\*(s*|.*)todo.*\*/
das zweite TODO (dreizeilig) bekomme ich nicht zu sehen. Ich habe jetzt schon einige
Stunden rumgebastelt, und langsam keinen Bock mehr.
Vieleicht hat ja jemand mitleid und kann mir weiterhelfen. Und wenn ich schon
am betteln bin, vieleicht weiss jemand wie ich dann noch an die Parameter in den
ToDos herankomme (-o und/oder -c)

ansonsten erstmal eine gute Nacht.

cruiser 13. Mai 2006 01:02

Re: Regulär bis zum abwinken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
RegEx.Expression := '/\*\s+TODO\s+(\d+)\s+-o(.*)\s+-c(.*)\s+:\s+(.*)\*/';
// dazu:
RegEx.ModifierG := false;
RegEx.ModifierS := true;
RegEx.ModifierI := true;
RegEx.ModifierM := true;
//oder kurz:
RegEx.ModifierStr := 'msi-g';
Dann in einer While-Schleife mit ExecPos suchen und die Ergebnisse in der Schleife auswerten:

RegEx.MatchPos[0] > Caret-Position des TODO's
RegEx.Match[1] > Priorität
RegEx.Match[2] > Besitzer (-o)
RegEx.Match[3] > Kategorie (-c)
RegEx.Match[4] > Text

Mit dem Demo sollt es verständlich sein.

colder 13. Mai 2006 08:25

Re: Regulär bis zum abwinken
 
Hallo und guten Morgen,

das ist ja echt super. Wie sagte einst schon Boris Becker "Ich bin drin!"
Danke für die Mühe, ich verstehe es zwar nicht aber es funkt.

Ich stelle mir hier die Frage, wie kann ich jetzt einen speziellen TODO-Entry
löschen bzw. ändern. Wenn ich das noch hätte wäre mein TODO-Handling fertig :-).

Ich hatte mir zum testen ein Tool heruntergeladen (Expresso Code Project) gebe
ich dort den RegEx ein, findet er nichts. Allem anschein nach, verlangen
unterschiedliche Tools, unterschiedliche Expressions.

Ich werde mich jetzt wohl noch etwas mehr mit der Sache befassen, ich meine ich
hätte zu diesem Thema irgendwo bei uns in der Company auch schon ein Buch gesehen.

Na ja, es hat halt Vorteile wenn man lesen kann.

gruss Andreas

cruiser 13. Mai 2006 13:35

Re: Regulär bis zum abwinken
 
mehrere Möglichkeiten:
du hinterlegst dir zu MatchPos[0] noch MatchLen[0] und löscht per SelStart/SelLenght/DeleteSelection (oder wie das ging :gruebel: )

oder:
mit copy und Kumpanen auf den String

oder aber:
ein RegEx-Replacement

In der eigenen Anwendung (Memo's etc.) das erste, wenn du dich irgendwo enhakst das zweite, das Dritte ist zwar Möglich, aber nicht wirklich zu empfehlen (rein von der Rechenzeit her :zwinker:

Und ja, TRegExpr ist nicht ganz Perl-Regex konform. Am besten du studierst mal die Website dazu. Dort sind einige Beispiele. TRegExpr Hilfe

colder 14. Mai 2006 09:46

Re: Regulär bis zum abwinken
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich schon wieder,

mitlerweile habe ich mein Projekt fast fertig. Ein Problem habe ich noch,
mit:

/\*\s+TODO\s+(\d+)\s+-o(.*)\s+-c(.*)\s+:\s+(.*)\*/

finde ich nun alle meine ToDos. Nun möchte ich meine ToDos auf "DONE" schalten,
was auch funktioniert. Allerdings findet jetzt meine Routine diese "DONE" nicht
mehr. Nun habe ich laut Hilfe den RegEx auf:

/\*\s+(TODO|DONE)\s+(\d+)\s+-o(.*)\s+-c(.*)\s+:\s+(.*)\*/

geändert. Jetzt allerdings findet er jetzt gar nichts mehr, auch keine TODOs.
Was mache ich falsch ?

Siehe Images!

cruiser 14. Mai 2006 16:34

Re: Regulär bis zum abwinken
 
Stehn der ModifierStr auch auf 'msi-g' ? Bei mir macht ers zumindest.

Oder: Poste mal den Codeschnipsel dazu bitte. Vielleicht liegt der Fehler gar nich in der RegEx.

colder 14. Mai 2006 16:57

Re: Regulär bis zum abwinken
 
Hallo,

hier der Code. In dieser Version funkt alles.

Delphi-Quellcode:
//------------------------------------------------------------------------------
// Procedure  : AddToDos
//------------------------------------------------------------------------------
procedure TToDoForm.AddToDos;
var
  i, iPrio, iIndex, iP1, iP2, iP3: Integer;
  sOwner: string;
  sCategory: string;
  sDate:string;
  sToDo: string;
  sModule: string;
  iToDoPos: Integer;
  iToDoLenght: Integer;
  iLine: TBufferCoord;

  procedure AddItem(iIndex, iLine, iLen, iPos: Integer; sToDo, sModule, sOwner, sCategory, sDate: string);
  begin
    with lvToDo.Items.Add do begin
      ImageIndex := iIndex;
      // Module
      Caption := sModule;
      // Owner
      SubItems.Add(sOwner);
      // Category
      SubItems.Add(sCategory);
      // Module
      SubItems.Add(sDate);
      // Line
      SubItems.Add(IntToStr(iLine));
      // Lenght
      SubItems.Add(IntToStr(iLen));
      // Pos
      SubItems.Add(IntToStr(iPos));
      // ToDo
      SubItems.Add(sToDo);
    end;
  end;

begin
  iP1 := 0;
  iP2 := 0;
  iP3 := 0;
  lvToDo.Items.BeginUpdate;
  lvToDo.Items.Clear;
  // Dieser Text wird geparst
  fRegEx.InputString := fLinesNew.Text;
  // Const expToDos = '/\*\s+TODO\s+(\d+)\s+-o(.*)\s+-c(.*)\s+:\s+(.*)\*/'; in uConsts.pas
  fRegEx.Expression := expToDos;
  fRegEx.Compile;
  fRegEx.ModifierStr := 'mis-g';
  i := 1;
  while fRegEx.ExecPos(i) do begin
    iToDoPos := fRegEx.MatchPos[0];
    iToDoLenght := fRegEx.MatchLen[0];
    iPrio := StrToIntDef(fRegEx.Match[1], 0);
    sOwner := fRegEx.Match[2];
    sCategory := fRegEx.Match[3];
    sDate := fRegEx.Match[4];
    sToDo := ClearNl(fRegEx.Match[5]);

    if Document <> nil then
      sModule := Document.FileName;
    iLine := Document.CharIndexToRowCol(iToDoPos);
    case iPrio of
      1: begin
          iIndex := 0;
          Inc(iP1);
          // For Filter
          AddItem(iIndex, iLine.Line, iToDoLenght, iToDoPos, sToDo, sModule, sOwner, sCategory, sDate);
        end;
      2: begin
          iIndex := 1;
          Inc(iP2);
          // For Filter
          AddItem(iIndex, iLine.Line, iToDoLenght, iToDoPos, sToDo, sModule, sOwner, sCategory, sDate);
        end;
      3: begin
          iIndex := 2;
          Inc(iP3);
          // For Filter
          AddItem(iIndex, iLine.Line, iToDoLenght, iToDoPos, sToDo, sModule, sOwner, sCategory, sDate);
        end;
    end;
    i := fRegEx.MatchPos[0] + fRegEx.MatchLen[0];
  end;

  lvToDo.Items.EndUpdate;
  StatusMsg(iP1, iP2, iP3);

end;
wie gesagt die andere Version mit (TODO|DONE) Matched nichts.

gruss Andreas.

cruiser 14. Mai 2006 17:06

Re: Regulär bis zum abwinken
 
Ich kann da keinen Fehler erkennen. :gruebel:

Saug bitte noch mal mein Demo, änder von TODO auf (TODO|DONE) und trag händisch einen Done-Kommentar ein.

Wenn ers im Demo bei dir auch nich findet, hast du ne andere TRegExp-Version (schätz ich). In dem Fall kann ich dir auch die Unit geben, die ich hier hab ;)

:wall: Da fällt mir ein: Damit hast du ein neues Suchpattern, die Indiezies verschieben sich dadurch natürlich. auf 1 liegt TODO oder DONE, 2 ist die Prio, 3 der Owner, 4 die Category und 5 der Text.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz