![]() |
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:
Mit folgender Expression bekomme ich schon mal das erste TODO (einzeilig) heraus
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) /\*(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. |
Re: Regulär bis zum abwinken
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Dann in einer While-Schleife mit ExecPos suchen und die Ergebnisse in der Schleife auswerten:
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'; 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. |
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 |
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. ![]() |
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! |
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. |
Re: Regulär bis zum abwinken
Hallo,
hier der Code. In dieser Version funkt alles.
Delphi-Quellcode:
wie gesagt die andere Version mit (TODO|DONE) Matched nichts.
//------------------------------------------------------------------------------
// 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; gruss Andreas. |
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