1

我想用一个匹配 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

有什么提示吗?

4

2 回答 2

1

这里不需要使用正则表达式。Data.ByteString已经提供了函数split,它可以让你在任何字节值上分割一个 ByteString。

于 2014-04-04T16:30:58.023 回答
1

来自man 3 regex

regcomp() 提供了 preg,一个指向模式缓冲区存储区的指针;正则表达式,指向空终止字符串的指针和 cflags,用于确定编译类型的标志。

因此,正则表达式"\x00",就像"\x00whatever"被评估为以空字符结尾的字符串一样,实际上等于""空字符串。

并匹配空字符串上的任何内容,将始终 yield ("", "", your_original_string)

最好的解决方案是可能使用Text.Regex.TDFA,正如我在之前的评论中提到的那样,它不会表现出这种行为

于 2014-04-04T17:09:34.290 回答