Delphi Inspiration – Delphi Components and Software Applications

TDIRegExSearchStream explained (German)

Anonymous editing of this Wiki page is disabled to hamper vandalism. To edit, you must first log in using the button in the left column.


Hallo, ich suche eine Delphi Bibliothek für reguläre Ausdrücke, die auch Streams durchsuchen kann.

Zur Suche in Streams eignen sich alle DIRegEx Klassen, die von TDICustomRegExSearch abgeleitet sind. Diese sind in der Hilfe unter "Class Hierarchy" gelistet.

Sind mit den TDICustomRegExSearch Klassen Einschränkungen der möglichen regulären Ausdrücke verbunden?

Die Stream-Suche benutzt den DFA Algorithmus. Dieser hat leichte Einschränkungen gegenüber dem Perl Algorithmus, die i.d.R aber nur fortgeschrittenen Anwendern auffallen sollten. Die wichtigsten sind:

  • Keine Unterscheidung zwischen "greedy" und "ungreedy". Alles ist "greedy", und es wird immer der längste String gefunden.
  • "Back references" sind nicht unterstützt, ein Syntax-Fehler wird angezeigt.

Für eine vollständige Liste und ausführliche Diskussion der Unterschiede bitte in der DIRegEx Hilfe nach "pcrematching specification" suchen.

Schränkt die Streamsuche den DFA Algorithmus weiterhin ein?

Die Streamsuche hat zusätzlich zum oben beschriebenen DFA Algorithmus lediglich eine weitere Einschränkung (in der Hilfe zu TDICustomRegExSearch beschrieben): Die Eigenschaft OverlapBufferSize bestimmt, wie weit die Suche zurückgeht kann, wenn ein potentieller Treffer sich als falsch erweist und gleichzeitig die Grenze zwischen dem vorherigen und dem aktuell geladenen Block überschneidet.

Ein Beispiel zur Verdeutlichung:

Suche nach 789ABCx|\w+

[ Block 1 ][ Block 2 ]
   [ OverlapSize ]
0123456789ABCDEFGHIJKL
          [ Treffer  ]</code>

Die Suche nach 789ABCx (erste Alternative) beginnt im 1. Block, bricht dann aber im 2. Block ab (kein x). Dank OverlapSize beginnt die Suche nach der zweiten Alternative \w+ jedoch noch vor dem Ende von Block 1 (bei 345…), so daß ABC… dennoch gefunden wird.

Gesetz dem Fall, daß ABC… nun allerding vor dem Anfang von OverlapBufferSize liegt, findet die Stream-Suche nur die Zeichen ab OverlapBufferSize:

[ Block 1 ][ Block 2 ]
      [ Overlap ]
789ABCDEFGHIJKLMNOPQRS
      [ Treffer      ]

Bei zu kleiner OverlapBufferSize können Treffer also nicht oder nicht in voller Länge gefunden werde. Dieses Problem tritt jedoch praktisch nicht auf, wenn OverlapBufferSize ausreichend groß gewählt wird (z.B. 100K). Dann braucht es sehr große Pattern oder ausufernde*, + oder {5,} Quantoren, damit die Suche scheitert. Einfache Ausdrücke wie z.B. Tom|Jerry sind auch bei kleinerer OverlapBufferSize (wie 1024) nicht betroffen.

wiki/regex/tdiregexstreamsearch_de.txt · Last modified: 2009/10/28 19:28 (external edit)