3

如果 Ruby 正则表达式匹配非字符串,to_str则在该对象上调用该方法以获取要匹配的实际字符串。我想避免这种行为;我想将正则表达式与不是字符串的对象进行匹配,但在逻辑上可以被认为是随机可访问的字节序列,并且对它们的所有访问都是通过一种byte_at()方法进行调解的(在精神上类似于 Java 的CharSequence.char_at()方法)。

例如,假设我想在任意正则表达式的任意文件中查找字节偏移量;该表达式可能是多行的,因此我不能一次只读取一行并在每一行中查找匹配项。如果文件很大,我不能把它全部放在内存中,所以我不能把它作为一个大字符串读入。但是,定义一个获取文件第 n 个字节的方法(根据速度需要进行缓冲和缓存)就足够简单了。

最终,我想构建一个功能齐全的绳索类,就像在Ruby Quiz #137中一样,并且我希望能够在它们上使用正则表达式,而不会因为将它们转换为字符串而造成性能损失。

我不想在 Ruby 的正则表达式实现的内部陷入困境,所以任何见解都将不胜感激。

4

1 回答 1

3

你不能。这在 Ruby 1.8 中不受支持。x,可能是因为它是一个极端情况;在 1.9 中它甚至没有意义。Ruby 1.9 不会以任何用户可维护的方式将其字符串映射到字节。相反,它使用字符代码点,因此它可以支持它接受的多种编码。并且 1.9 的新优化正则表达式引擎 Oniguruma 也是围绕相同的编码和代码点概念构建的。字节只是不进入这个级别的图片。

我怀疑您要求的是过早优化的情况。对于任何合理的 Ruby 对象,实现to_str不应该是一个巨大的性能障碍。如果是这样,那么 Ruby 可能不适合您,因为它以各种方式将您与原始数据抽象并隔离开来。

您在大型二进制文件中查找字节序列的示例不是 Ruby 的理想用例——您最好使用grep或其他一些 Unix 工具。如果您需要 Ruby 程序中的结果,请使用反引号将其作为系统进程运行并处理输出。

于 2009-10-26T03:22:37.597 回答