AGB  ·  Datenschutz  ·  Impressum  







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

Regulär bis zum abwinken

Ein Thema von colder · begonnen am 12. Mai 2006 · letzter Beitrag vom 14. Mai 2006
Antwort Antwort
Benutzerbild von colder
colder

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#1

Regulär bis zum abwinken

  Alt 12. Mai 2006, 23:35
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.
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Regulär bis zum abwinken

  Alt 13. Mai 2006, 01:02
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.
Angehängte Dateien
Dateityp: zip demo_782.zip (3,0 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von colder
colder

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#3

Re: Regulär bis zum abwinken

  Alt 13. Mai 2006, 08:25
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
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Regulär bis zum abwinken

  Alt 13. Mai 2006, 13:35
mehrere Möglichkeiten:
du hinterlegst dir zu MatchPos[0] noch MatchLen[0] und löscht per SelStart/SelLenght/DeleteSelection (oder wie das ging )

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

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

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#5

Re: Regulär bis zum abwinken

  Alt 14. Mai 2006, 09:46
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!
Miniaturansicht angehängter Grafiken
done_231.png   todo_102.png  
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Regulär bis zum abwinken

  Alt 14. Mai 2006, 16:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von colder
colder

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#7

Re: Regulär bis zum abwinken

  Alt 14. Mai 2006, 16:57
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.
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Regulär bis zum abwinken

  Alt 14. Mai 2006, 17:06
Ich kann da keinen Fehler erkennen.

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

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.
  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 13:00 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