Delphi Inspiration

Components and Applications

User Tools

Site Tools


wiki:regex:tdiregexstreamsearch_de

DIRegEx: TDIRegExSearchStream explained (German / Deutsch)

DIRegEx is a library of components and procedures that implement regular expression pattern matching using the same syntax and semantics as Perl for Delphi (Embarcadero / CodeGear / Borland).

Please register and / or log in to edit. Anonymous Wiki edits are disabled to protect against vandalism.

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: 2016/01/22 15:09 (external edit)