2012-04-08 88 views
1

現在這個對我來說是一個很大的挑戰。正則表達式,ANTLR還是其他解決方案?

我大約1000個查詢在一個文件中,所有類似的模式的是去爲得到:

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

現在,其中#表示任何號碼非空白charecters。
我已經編寫了一段代碼,可以讀取上面的代碼並生成相應的正則表達式。
但是,大約有100,000名候選人,並且我提到了大約1000個這樣的查詢,以便對比賽進行評估。
這使得我的代碼在計算上相當昂貴,因爲它要達到m * n的數量級。

我已經經歷了ANTLR,我發現學習曲線非常陡峭。雖然聽起來很有希望,但在我腦海中的某個角落,如果可以通過使用Antlr實現,我仍然存在疑問。請讓我知道您的意見或任何其他可行的解決方案。

+1

能否請您詳細解釋一下哪些圖案(長度相同,長度不同等),以及您需要怎樣處理它們。 – 2012-04-08 20:13:38

+0

這些模式旨在處理各種關鍵字,如'* * Telecom#Servic#\ *'將匹配'電信服務'。模式長度可以根據關鍵字而變化。我想識別每個變體及其相應的模式。 – 2012-04-08 20:15:42

回答

1

完成它。 使用正則表達式,花了一個小時, 使用Lucene,WildCardQueries和一個booleanQuery來處理排列,在11分鐘內完成工作。 *希望如果可以有一個時間表在一週內學習Flex。 但是對於大型DataSet,Regex和Crunching而言,Lucene是一個不錯的選擇。 它可能並不總是解決你的問題,但它只是另一種解決方案。

0

我認爲在ANTLR中沒有必要,因爲簡單的字符串查找和替換是可能的:# - >\\.*。應刪除星號。

因此對於*Telecom#Servic#*你得到了Telecom\\.*Servic\\.*。您還可以添加$和^來檢查字符串的開始/結束。

+0

我已經實現了。但是,它變得相當昂貴。就像我說的,我有1000個這樣的查詢。因此,我必須通過1000次候選人才能完成1000次。 – 2012-04-08 20:29:07

+0

這樣生成的正則表達式就像^。* \\ s + Telecom \\ S * \\ s + Servic \\ S * \\ s +。* $ – 2012-04-08 20:48:13

+0

那麼,目標是什麼?通過消除某些其他正則表達式覆蓋的正則表達式來減少正則表達式的數量? – 2012-04-08 21:34:46

2

在我看來,你有多達數千個單獨的正則表達式r1,r2,... r1000,這些正則表達式識別結果A,B,C中的一些固定集合(遠小於單個正則表達式的數量) C,...

在這種情況下,您可以在邏輯上組合結果A的正則表達式a1,a2,... an和結果B的b1,... bm。(分離組合正則表達式和正則表達式是正則表達式的一個公認的理論特性)。

表達正則表達式的大多數系統(也許不是你的)允許你寫爲

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

或某些等效語法。這樣的系統通常與所謂的lexer generators有關,它們允許編譯器編寫者用字符表示令牌的精細語法語法。

這種工具一大優點是,爲了匹配(所有的正則表達式)的標記通常是通過計算有限狀態機次線性相對於正則表達式的數量,成爲可能,其中由一組正則表達式共享的前綴僅被識別一次。這可能意味着巨大的加速並直接適用於諸如您的情況。

廣泛使用的工具FLEX可以非常有效地完成這項工作。 ANTLR具有某種用於識別表示爲正則表達式的令牌的機制,但我不知道它是否會生成有效的有限狀態匹配器。

+0

謝謝。但我有一個非常短的時間線,並通過Lucene完成。 – 2012-04-17 19:46:04