2012-04-08 8 views
1

Jetzt ist dies eine Herausforderung für mich.Regex, ANTLR oder eine andere Lösung?

Ich habe rund 1000 Abfragen in einer Datei, die alle ein ähnliches Muster, das wie geht:

***\*XYZ#PQR#\**** 

Jetzt, wo # zeigt jede Nummer nicht-Leerzeichen charecters.
Ich habe bereits ein Stück codiert, das die obige Zeile lesen und eine entsprechende Regex generieren kann.
Allerdings gibt es rund 100.000 Kandidaten und als ich um 1000 solche Abfragen erwähnte für das Spiel zu bewerten.
Dies macht meinen Code ziemlich rechenintensiv, da er in der Größenordnung von m * n liegt.

Ich habe durch ANTLR gewesen und ich fand, dass die Lernkurve sehr steil ist. Obwohl es sich ziemlich vielversprechend anhört, bin ich immer noch skeptisch, ob dies mit Antlr erreicht werden kann. Bitte lassen Sie mich wissen, Ihre Meinung oder eine andere praktikable Lösung.

+1

Könnten Sie bitte genauer erklären, was die Muster sind (die gleiche Länge, unterschiedliche Länge usw.) und was Sie mit ihnen tun müssen. –

+0

Die Muster sollen Variationen von Schlüsselwörtern wie "\ * Telecom # ServiC# \ *" behandeln "Telekommunikationsdienste" entsprechen. Die Länge des Musters kann abhängig vom Keyword variieren. Ich möchte jede Variation und ihr entsprechendes Muster identifizieren. –

Antwort

1

mit ihm getan. Mit Regex, es dauerte eine Stunde, Mit Lucene, WildCardQueries und einem booleanQuery die Permutationen, Arbeit in 11 Minuten Geschehen zu handhaben. * Wünsche Wenn man eine Zeitleiste haben könnte Flex in einer Woche zu lernen. Aber Lucene ist eine gute Option für große DataSets, Regex und Crunching. Es löst nicht immer Ihr Problem, aber es ist nur eine andere Lösung.

0

Ich denke, es gibt keine Notwendigkeit in ANTLR, wie einfache Zeichenfolge finden und ersetzen ist möglich: ->\\.*. Sternchen sollten entfernt werden.

Also für *Telecom#Servic#* bekam man Telecom\\.*Servic\\.*. Sie können auch $ und^hinzufügen, um den Anfang/das Ende der Zeichenfolge zu überprüfen.

+0

Ich habe das schon gleich implementiert. Es wird jedoch ziemlich teuer. Wie gesagt, ich habe 1000 solcher Anfragen. Also muss ich die 100.000 Kandidaten 1000 Mal durchspielen. –

+0

der so erzeugte Regex wäre etwas wie ^. * \\ s + Telecom \\ S * \\ s + Servic \\ S * \\ s +. * $ –

+0

Also was ist das Ziel? Um die Anzahl der Regexes zu reduzieren, indem Regexes eliminiert werden, die von einem anderen Regexp abgedeckt werden? –

2

Es scheint mir, dass Sie haben, was Tausende von einzelnen regulären Ausdrücken, r1, r2, ... r1000, die eine feste Menge (viel kleiner als die Anzahl der einzelnen regulären Ausdrücke) der Ergebnisse A, B, identifizieren C, ...

In diesem Fall können Sie die regulären Ausdrücke a1, a2, ... an für Ergebnis A und b1, ... bm für Ergebnis B logisch kombinieren. (Die Fähigkeit, disjunktiv zu verfassen Reguläre Ausdrücke und reguläre Ausdrücke sind eine wohlbekannte theoretische Eigenschaft regulärer Ausdrücke.

Die meisten Systeme zur Expression von regulären Ausdrücken (vielleicht nicht verkaufen) können Sie diese

a1 | a2 | .. | an --> A 

oder eine äquivalente Syntax wie

schreiben. Solche Systeme sind oft mit so genannten lexer generators verbunden, die es Compiler-Schreibern erlauben, die feinkörnige Syntax von Token in Form von Zeichen auszudrücken. Ein großer Vorteil solcher Werkzeuge ist, dass der Aufwand für die Übereinstimmung (alle regulären Ausdrücke für) die Token ist oft sublinear in Bezug auf die Anzahl der regulären Ausdrücke, ermöglicht durch die Berechnung einer endlichen Maschine in dem Präfixe, die von einigen regulären Ausdrücken gemeinsam benutzt werden, werden nur einmal für die Menge erkannt. Dies kann enorme Beschleunigungen bedeuten und wirkt sich direkt auf Situationen wie Ihre aus.

Das weithin verfügbar Werkzeug FLEX dies sehr effizient macht. ANTLR hat eine Art Mechanismus zur Erkennung von Tokens, die als reguläre Ausdrücke ausgedrückt werden, aber ich weiß nicht, ob es effiziente endliche Zustandsvergleicher erzeugt.

+0

Danke. Aber ich hatte eine sehr kurze Zeitleiste und habe es über Lucene geschafft. –