2009-10-26 22 views
3

如果Ruby正則表達式與非String字符串匹配,則會在該對象上調用to_str方法以獲取與之匹配的實際字符串。我想避免這種行爲;我希望將正則表達式與不是Strings的對象進行匹配,但可以邏輯地將其視爲可隨機訪問的字節序列,並且通過byte_at()方法(類似於Java的CharSequence.char_at()方法的精神)調解對它們的所有訪問。在沒有轉換的情況下將正則表達式與Ruby中的非字符串進行匹配

例如,假設我想在任意正則表達式的任意文件中查找字節偏移量;表達式可能是多行的,所以我不能一次只讀一行,並在每行中尋找匹配。如果文件非常大,我無法將它全部放在內存中,所以我不能只將它看作一個大字符串。但是,定義一個獲取文件第n個字節的方法(根據速度需要使用緩衝和緩存)將會非常簡單。最後,我想要構建一個全功能的rope類,就像在Ruby Quiz #137中一樣,我希望能夠對它們使用正則表達式,而不會將性能損失轉換爲字符串。

我不想在Ruby的正則表達式實現的內部找到我的胳膊肘,所以任何見解都將不勝感激。

+1

當你大聲讀出它時,它仍然聽起來像個好主意? – 2009-10-26 01:45:02

+0

我同意我可能不會在Ruby中實現第一個例子,但我認爲有一個非字符串的正則表達式接口是一個好主意。 – Bkkbrad 2009-10-26 01:55:46

回答

3

你不能。這在Ruby 1.8中不受支持。 x,可能是因爲它是這樣的邊緣情況;在1.9中它甚至沒有意義。 Ruby 1.9不會以任何用戶可用的方式將其字符串映射到字節;相反,它使用字符代碼點,以便它可以支持它接受的多種編碼。 1.9的新優化正則表達式引擎Oniguruma也是圍繞相同的編碼和代碼點概念構建的。在這個級別字節不會進入圖片。

我有一個懷疑,你要求的是一個過早優化的情況。對於任何合理的Ruby對象,實施to_str不應該是一個巨大的性能障礙。如果是這樣,那麼Ruby可能是你的錯誤工具,因爲它會以各種方式將你的原始數據抽象出來並將其隔離開來。

您在大型二進制文件中查找字節序列的示例對於Ruby來說並不理想 - 您最好使用grep或其他一些Unix工具。如果您需要Ruby程序中的結果,請使用反引號將其作爲系統進程運行並處理輸出。

+0

我認爲這個答案關注問題的錯誤部分。想要實現一個繩索支持的字符串類型是合理的,並且能夠在不將其先導出到字符串的情況下進行搜索。如果新的字符串類型支持獲取「第n個」字符,那麼希望標準的正則表達式匹配機制可以擴展到它是合理的。 – 2016-12-14 05:08:55

相關問題