2012-10-09 28 views
4

是否有一種方法或高效的庫允許在Java中進行增量式正則表達式匹配?在Java中匹配的增量模式(RegEx)?

我的意思是,我想要一個OutputStream,我可以一次發送幾個字節,並跟蹤正則表達式的數據。如果接收到的字節會導致此正則表達式肯定與而不是匹配,那麼我希望該流告訴我。否則,它應該讓我知道當前最好的匹配,如果有的話。

我意識到這可能是一個非常困難和沒有明確定義的問題,因爲我們可以想象正則表達式可以匹配整個表達式或其任何部分,或者在流無論如何關閉之前都不會做出決定。即使像。*這樣微不足道的東西可以匹配H,He,Hel,Hell,Hello,等等。在這種情況下,我希望這個流說:「是的,如果它現在結束,這個表達式可以匹配,這裏是它將返回的組。」

但是,如果模式在內部逐步穿過字符串,它會逐字符匹配,它可能不那麼難?

+0

事實上,回溯是正則表達式評估的常態。你的直覺,這將是不明確的,絕對是現貨。 –

+0

@MarkoTopolnik我猜你可以使用回溯並仍然按順序處理字符,但是,不是嗎?或者正則表達式引擎在字符串中跳躍以做「隨機」預測? –

+0

向前看可能需要檢查整個輸入序列,而不實際匹配任何內容。 –

回答

1

增量匹配可以通過計算有限狀態自動機對應於正則表達式,以及對進行狀態遷移而處理輸入的字符被很好地實現。大多數詞法分析器都是這樣工作的。儘管如此,這種方法對於並不適用。

所以也許你可以做出這兩個部分:有一個匹配器,它可以確定是否有任何匹配,或者將來匹配的任何機會。你可以使用它在每個輸入字符後給你一個快速回復。一旦你有完整的匹配,你可以通過回溯和分組正則表達式引擎來識別你的匹配組。在某些情況下,將分組內容編碼到自動機中也是可行的,但我想不出一種通用的方法來實現這一點。

+0

FSM僅模擬現代正則表達式語言的基本子集。 –

+0

這應該在我的情況下很好,只是有點工作。我希望有某種可用的功能藏在某個地方。但是我想,爲了確保你完全理解它,自己實現一些東西永遠不會感到痛苦。 –