Соответствие регулярных выражений для не-строк в Ruby без преобразования - PullRequest
3 голосов
/ 26 октября 2009

Если регулярное выражение Ruby совпадает с чем-то, что не является строкой, для этого объекта вызывается метод to_str, чтобы получить фактическую строку для сравнения. Я хочу избежать этого поведения; Я хотел бы сопоставлять регулярные выражения с объектами, которые не являются строками, но логически могут рассматриваться как произвольно доступные последовательности байтов, и все обращения к ним осуществляются с помощью метода byte_at() (по духу сходного с Java * 1003) * метод).

Например, предположим, я хочу найти смещение байта в произвольном файле произвольного регулярного выражения; выражение может быть многострочным, поэтому я не могу просто читать строку за раз и искать совпадения в каждой строке. Если файл очень большой, я не могу поместить все это в память, поэтому я не могу просто прочитать его как одну большую строку. Однако было бы достаточно просто определить метод, который получает n-й байт файла (с буферизацией и кэшированием, которые необходимы для скорости).

В конце концов, я бы хотел создать полнофункциональный класс веревка , как в Ruby Quiz # 137 , и я хотел бы иметь возможность использовать регулярные выражения для них без потери производительности преобразования их в строки.

Я не хочу встать на ноги во внутренностях реализации регулярных выражений Ruby, поэтому любая оценка будет принята.

1 Ответ

3 голосов
/ 26 октября 2009

Вы не можете. Это не было поддержано в Ruby 1.8. x , вероятно, потому что это такой крайний случай; а в 1.9 это даже не имеет смысла. Ruby 1.9 не отображает свои строки в байтах каким-либо способом, обслуживаемым пользователем; вместо этого он использует кодовые точки символов, чтобы он мог поддерживать множество кодировок, которые он принимает. И новый оптимизированный движок регулярных выражений 1.9, Oniguruma, также основан на той же концепции кодирования и кодовых точек. На этом уровне байты просто не входят в картинку.

У меня есть подозрение, что вы запрашиваете случай преждевременной оптимизации. Для любого разумного объекта Ruby реализация to_str не должна быть огромным препятствием для производительности. Если это так, то Ruby, вероятно, не тот инструмент, который вам подходит, поскольку он абстрагирует и изолирует вас от ваших необработанных данных различными способами.

Ваш пример поиска последовательности байтов в большом двоичном файле не идеальный вариант использования для Ruby - вам лучше использовать grep или какой-либо другой инструмент Unix. Если вам нужны результаты в вашей Ruby-программе, запустите ее как системный процесс с помощью обратных галочек и обработайте вывод.

...