Aquí hay un poco de desajuste de impedancia. Desea trabajar con expresiones regulares en .Net que utilizan cadenas (caracteres de varios bytes), pero desea trabajar con caracteres de un solo byte. No puede tener ambos al mismo tiempo usando .Net como de costumbre.
Sin embargo, para eliminar esta falta de coincidencia, podría tratar una cadena de forma orientada a bytes y mutarla. La cadena mutada puede actuar como un buffer reutilizable. De esta forma, no tendrá que convertir bytes en caracteres, o convertir su búfer de entrada en una cadena (según su pregunta).
Un ejemplo:
//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);
}
}
Usando esta técnica se puede asignar una cadena "buffer" que puede ser reutilizado como entrada de expresiones regulares, pero se puede mutar con sus bytes cada vez. Esto evita la sobrecarga de convertir \ codificación de su matriz de bytes en una nueva cadena .Net cada vez que desea hacer una coincidencia. Esto podría ser muy significativo ya que he visto que muchos algoritmos en .Net intentan ir a un millón de millas por hora solo para que se pongan de rodillas por la generación de cadenas y el posterior montón de spam y el tiempo pasado en GC.
Obviamente este es un código inseguro, pero es .Net.
Los resultados de la Regex generarán cadenas, por lo que tiene un problema aquí. No estoy seguro de si hay alguna forma de usar Regex que no genere nuevas cadenas. Sin duda, puede obtener información sobre el índice y la duración del partido, pero la generación de cadenas infringe sus requisitos de eficiencia de la memoria.
actualización
en realidad después de desmontar expresión regular \ partido \ Grupo \ Capture, que parece que sólo genera la cadena capturado cuando acceda a la propiedad Value, por lo que es posible que al menos no estar generando cadenas si solo acceder a las propiedades de índice y longitud. Sin embargo, generará todos los objetos Regex de soporte.
¿Puede proporcionar un ejemplo de un patrón RegEx que está intentando hacer coincidir? –
@Nate Dudek, no veo cómo es relevante. Estoy buscando una biblioteca general de expresiones regulares ya que estoy tratando de analizar protocolos de Internet complejos. No es una expresión regular específica. Si realmente necesita un ejemplo, consulte http://www.ietf.org/rfc/rfc2616.txt para ver las expresiones regulares allí (también hace referencia a otros archivos rfcs) – brickner
En realidad, .NET no admite entradas binarias para expresiones regulares. Entiendo que no desea perder tiempo de computación en la conversión, pero si su único temor es tener caracteres especiales, puede convertir los bytes en cadenas sin problemas ya que la cadena .NET está codificada con Unicode UTF-16. Todos los personajes serán compatibles. – Ucodia