2011-01-19 68 views
1

我有40KB的HTML頁面,我想找到它的某些模式。在長字符串中查找模式?

我可以通過1K緩衝區讀取它,但我想避免這種情況,即我正在搜索的模式會在兩個緩衝區讀取之間分開。

如何克服這個問題?

回答

3

這很簡單。您可以計算您要查找的最長模式,然後按照該數量回溯文件指針,或者滾動文件,只讀取增量。

想象一下最長的模式是26個字節。

  1. 閱讀1k。
  2. 檢查所有模式 - >無。
  3. 從緩衝區中刪除1k - 26個字節。
  4. 閱讀1000 - 從物流26個字節,並添加到您的緩衝區
  5. 轉到2.

編輯:讓我澄清一下:有兩種方法可以做到這一點,兩者各有優劣。我上面記錄的一個最適合用於從流中讀取數據,這意味着不支持查找的數據源。但是,如果您的數據源確實支持尋找(如文件系統文件),那麼您可以輕鬆地使用搜索。檢查圖案,如果找不到,請回溯最長圖案的尺寸,然後從那裏開始。

但是,如果您希望支持搜索長度超過緩衝區大小的模式,則可能需要更聰明的算法。您需要一個包含當前「打開」的所有模式的查閱表,以便讀取更多數據,這反過來會花費更多的內存 - 您會遇到問題。

+0

讓我們只希望他的長度最長的字符串不是1k-1 :) – 2011-01-19 15:14:20

+0

好主意,但它只適用於,如果他搜索確切的字符。如果模式 - 一些html標籤之間的所有內容。它的長度是不可預測的。 – 2011-01-19 15:14:46

0

爲什麼不使用SAX parser。它是建立處理大型文件的標記。如果您嘗試在同一級別的不同元素上進行匹配,您會遇到問題。然而,這不是不可能處理