Yunqa • The Delphi Inspiration

Delphi Components and Applications

User Tools

Site Tools


wiki:regex:tdiregexstreamsearch_de
no way to compare when less than two revisions

Differences

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


wiki:regex:tdiregexstreamsearch_de [2016/01/22 15:09] (current) – created - external edit 127.0.0.1
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 by 127.0.0.1