我想用一个匹配 NUL\x00
字节的正则表达式拆分一个巨大的(12GB)惰性 ByteString。
我知道这应该是可能的,因为我已经能够用 python 分割一个示例字符串:
>>> from re import split
>>> split(b"\x00", b"a\x00b")
[b'a', b'b']
我不确定它是否可以工作,但我想尝试一下 Haskell,因为它应该能够懒惰地读取文件并对其进行处理,而无需为整个字符串分配内存。(这应该比逐块处理、编写解析器或调整原始程序以输出更少损坏的东西更容易)。
ByteStrings 上的 Haskell 正则表达式匹配非常简单:
("a\x01\&b" :: ByteString) =~ ("\x01" ::ByteString) :: (ByteString, ByteString, ByteString)
("a","\SOH","b")
但是对 a 做同样的事情会\x00
产生一些奇怪的东西:
("a\x00\&b" :: ByteString) =~ ("\x00" ::ByteString) :: (ByteString, ByteString, ByteString)
("","","a\NULb")
请注意,它并没有找不到匹配项(否则元组的第一个元素将是原始字符串),而是显然匹配不可见/隐式\x00
。
有什么提示吗?