Здесь происходит небольшое несоответствие импеданса. Вы хотите работать с регулярными выражениями в .Net, которые используют строки (многобайтовые символы), но вы хотите работать с однобайтовыми символами. Вы не можете использовать оба одновременно, используя .Net, как обычно.
Однако, чтобы устранить это несоответствие, вы можете иметь дело со строкой в байтовой манере и изменять ее. Затем мутированная строка может выступать в качестве повторно используемого буфера. Таким образом, вам не нужно будет преобразовывать байты в символы или конвертировать входной буфер в строку (в соответствии с вашим вопросом).
Пример:
//BLING
byte[] inputBuffer = { 66, 76, 73, 78, 71 };
string stringBuffer = new string('\0', 1000);
Regex regex = new Regex("ING", RegexOptions.Compiled);
unsafe
{
fixed (char* charArray = stringBuffer)
{
byte* buffer = (byte*)(charArray);
//Hard-coded example of string mutation, in practice you would
//loop over your input buffers and regex\match so that the string
//buffer is re-used.
buffer[0] = inputBuffer[0];
buffer[2] = inputBuffer[1];
buffer[4] = inputBuffer[2];
buffer[6] = inputBuffer[3];
buffer[8] = inputBuffer[4];
Console.WriteLine("Mutated string:'{0}'.",
stringBuffer.Substring(0, inputBuffer.Length));
Match match = regex.Match(stringBuffer, 0, inputBuffer.Length);
Console.WriteLine("Position:{0} Length:{1}.", match.Index, match.Length);
}
}
Используя эту технику, вы можете выделить строковый «буфер», который можно повторно использовать в качестве входных данных для Regex, но вы можете каждый раз изменять его байтами. Это позволяет избежать затрат на преобразование \ кодирование вашего байтового массива в новую строку .Net каждый раз, когда вы хотите выполнить сопоставление. Это может оказаться очень важным, поскольку я видел, как многие алгоритмы в .Net пытаются разогнаться до миллиона миль в час только для того, чтобы оказаться на коленях при генерации строк и последующем рассылке спама и времени, проведенном в GC.
Очевидно, что это небезопасный код, но это .Net.
Результаты регулярных выражений будут генерировать строки, поэтому у вас есть проблема здесь. Я не уверен, есть ли способ использовать Regex, который не будет генерировать новые строки. Вы, конечно, можете получить информацию об индексе соответствия и длине, но генерация строк нарушает ваши требования к эффективности памяти.
Обновление
На самом деле после дизассемблирования Regex \ Match \ Group \ Capture создается впечатление, что он генерирует захваченную строку только при доступе к свойству Value, поэтому, по крайней мере, вы можете не генерировать строки, если обращаетесь только к свойствам index и length. Однако вы будете генерировать все вспомогательные объекты Regex.