在Ruby中无转换地将正则表达式与非字符串匹配

在Ruby中无转换地将正则表达式与非字符串匹配,ruby,regex,string,ropes,Ruby,Regex,String,Ropes,如果Ruby正则表达式与非字符串的内容相匹配,则对该对象调用to_str方法以获取要匹配的实际字符串。我想避免这种行为;我想将正则表达式与不是字符串的对象进行匹配,但在逻辑上可以将其视为可随机访问的字节序列,对它们的所有访问都通过byte\u at()方法进行中介(与Java的CharSequence.char\u at()方法的精神类似) 例如,假设我想在任意正则表达式的任意文件中查找字节偏移量;表达式可能是多行的,所以我不能一次只读入一行,然后在每行中查找匹配项。如果文件很大,我无法将其全部

如果Ruby正则表达式与非字符串的内容相匹配,则对该对象调用
to_str
方法以获取要匹配的实际字符串。我想避免这种行为;我想将正则表达式与不是字符串的对象进行匹配,但在逻辑上可以将其视为可随机访问的字节序列,对它们的所有访问都通过
byte\u at()
方法进行中介(与Java的
CharSequence.char\u at()
方法的精神类似)

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

最后,我希望构建一个功能齐全的类,如中,并且我希望能够在它们上使用正则表达式,而不会因为将它们转换为字符串而损失性能


我不想涉足Ruby正则表达式实现的内部,因此任何洞察都将不胜感激。

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

我怀疑你所要求的是一个过早优化的案例。对于任何合理的Ruby对象,实现到_str不应该是一个巨大的性能障碍。如果是的话,那么Ruby对您来说可能是错误的工具,因为它以各种方式将您从原始数据中抽象出来并隔离开来


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

当您大声读出来时,这听起来还是个好主意吗?我同意我可能不会在Ruby中实现第一个示例,但我确实认为为非字符串提供正则表达式接口是一个好主意。我认为这个答案集中在问题的错误部分。想要实现一个有绳索支撑的字符串类型,并且能够在不首先将其导出为字符串的情况下搜索它,这是合理的。如果新的字符串类型支持获取“n”字符,那么有理由希望标准的regexp匹配机制可以扩展到它。