Delphi Inspiration

Components and Applications

User Tools

Site Tools


wiki:regex:tdiregexstreamsearch_de

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

wiki:regex:tdiregexstreamsearch_de [2016/01/22 15:09] (current)
Line 1: Line 1:
 +====== DIRegEx: TDIRegExSearchStream explained (German / Deutsch) ======
  
 +{{page>​products:​regex:​header}}
 +{{page>:​wiki-header}}
 +
 +>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)