2012-04-09 2 views
1

Kennt jemand eine gute streaming regulären Ausdruck Parser für Java?Regelmäßiger Ausdruck auf SAX-Stream anwenden

Insbesondere möchte ich in der Lage sein, den Inhalt eines XML-Element-Streams durchzusehen und zu erkennen, ob und wo der Inhalt einem bestimmten regulären Ausdruck entspricht. Zum Beispiel möchte ich die SAX- "Zeichen" -Rückrufe vom Inhalt eines MediaWiki-Element-Streams durchsehen, aber feststellen, wo Teilzeichenfolgen mit Übereinstimmung == ([^ = \ n] +) == vorkommen.

Der Trick ist, dass der Inhalt in Chunks von unbestimmter Größe kommt, was bedeutet, dass übereinstimmende Teilstrings möglicherweise über mehrere Callbacks unterbrochen werden können.

Die einfache Lösung besteht natürlich darin, einfach alle Callbacks zu puffern und die eingebaute Regexp-Engine von Java auf der langen Zeichenfolge auszuführen. Das nimmt leider zu viel Speicher in Anspruch.

Der nächste Schritt in der Komplexität besteht darin, das Regexp in ein DFA umzuwandeln und zu erkennen, wann das DFA in den Zustand "Accept" übergeht. Ich habe mich gefragt, ob jemand weiß, ob einige Java-Bibliotheken diesen Prozess vereinfachen.

Ich habe Ragel angesehen; Dies erfordert jedoch, dass das DFA zur Kompilierzeit angegeben wird.

+0

Ein solcher passender Teilstring (wie in Ihrem Beispiel) würde nur eine einzelne Zeile umfassen, was ist das Problem der Pufferung der letzten Zeile (oder ein paar von ihnen)? – Qtax

+0

Ich kann mich nicht darauf verlassen, dass die Linien vernünftig sind. Einige Datensätze wurden mit langen Müllzeilen verwüstet. Vandalismus-Erkennung sollte nicht schrecklich hart sein, aber ich dachte, ich würde ein paar Minuten damit verbringen, diesen Ansatz zu untersuchen. – Zack

Antwort

-1

diese Rückrufe Puffer für die regexp ein Tag jedes Mal überprüfen geschlossen ist, entsorgen Sie den Puffer

+0

Einige Tags enthalten Hunderte von Megabytes an Daten. – Zack

0

die hitEnd von Matcher könnte nützlich sein, in diesem Fall vielleicht:

Wenn diese Methode true zurückgibt, dann ist es möglich, dass mehr Eingaben das Ergebnis der letzten Suche verändert hätten.

Sie könnten versuchen, jeden Brocken passen, und wenn es keine Übereinstimmung gibt, aber hitEnd gibt true zurück, würden Sie den nächsten Brocken anhängen müssen und versuchen Sie es erneut.

Es wäre großartig, wenn der Matcher irgendwie auch den möglichen Startindex zurückgeben würde, aber das scheint nicht möglich zu sein.