2011-01-21 204 views
3

我有一個正則表達式,用於測試輸入的字符流。我想知道是否有一種方法將正則表達式與輸入進行匹配,並確定它是否是使用整個輸入緩衝區的部分匹配?即輸入緩衝區的末尾在regexp完成之前到達。我希望實現決定是否等待更多輸入字符,或中止操作。部分正則表達式匹配

換句話說,我需要確定哪一個是正確的:

  1. 正則表達式被匹配

    之前達到輸入緩衝器的端部例如"foo" =~ /^foobar/

  2. 正則表達式匹配完全

    例如"foobar" =~ /^foobar/

  3. 正則表達式眼福

    例如"fuubar" =~ /^foobar

該輸入未打包。

回答

0

這是你正在解決的情況嗎?您正在等待字符串,例如'foobar的'。如果用戶鍵入部分匹配,例如'foo',你想繼續等待。如果輸入是一個不匹配,你想退出。

如果你正在使用文字字符串,我只會寫一個循環來測試字符的順序。或者,

If (input.Length < target.Length && target.StartsWith(input)) 
    // keep trying 

如果您嘗試匹配更復雜的正則表達式,我不知道如何在正則表達式中執行此操作。但是我會先閱讀關於平臺如何實現正則表達式的更多內容。

tom

0

我不確定這是不是你的問題。
正則表達式匹配與否。表達式將匹配可變數量的輸入。所以不能直接確定。

但是,如果您認爲存在重疊的可能性,則可以使用智能緩衝方案來實現相同的目的。

有很多方法可以做到這一點。

一種方法是通過斷言來匹配所有不匹配的東西,直到獲得匹配的開始 (但不是您尋求的完全匹配)。 這些你簡單地扔掉你的緩衝區並清除。當你找到一個匹配時,清除它之前的數據和數據的緩衝區。

示例:/(<function.*?>)|([^<]*)/您從緩衝區丟棄/清除的部分位於組2捕獲緩衝區中。

另一種方法是,如果你匹配有限長度的字符串,如果你不匹配緩衝區中的任何東西,你可以安全地扔掉所有從緩衝區開始到緩衝區結束減去長度您正在搜索的有限字符串。

示例:您的緩衝區大小爲64k。您正在搜索一個長度爲10的字符串。它在緩衝區中找不到。您可以安全地清除(64k - 10)個字節,保留最後10個字節。然後將(64k-10)個字節附加到緩衝區的末尾。當然,您只需要一個10字節的緩衝區,不斷刪除/添加1個字符,但更大的緩衝區更有效,您可以使用閾值重新加載更多數據。

如果您可以創建容易合同/擴展的緩衝區,則可以使用更多緩衝選項。