Có một chút không phù hợp trở kháng xảy ra tại đây. Bạn muốn làm việc với các biểu thức chính quy trong .Net sử dụng các chuỗi (các ký tự nhiều byte), nhưng bạn muốn làm việc với các ký tự byte đơn. Bạn không thể có cả hai cùng một lúc bằng cách sử dụng. Net như bình thường.
Tuy nhiên, để phá vỡ sự không phù hợp này, bạn có thể xử lý chuỗi theo kiểu byte theo định hướng và thay đổi nó. Chuỗi biến đổi sau đó có thể hoạt động như một bộ đệm có thể sử dụng lại. Bằng cách này bạn sẽ không phải chuyển đổi byte thành ký tự, hoặc chuyển đổi bộ đệm đầu vào của bạn thành một chuỗi (theo câu hỏi của bạn).
Một ví dụ:
//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);
}
}
Sử dụng kỹ thuật này, bạn có thể phân bổ một chuỗi "đệm" mà có thể được tái sử dụng làm đầu vào cho Regex, nhưng bạn có thể biến nó với byte của bạn mỗi lần. Điều này tránh được việc chuyển đổi \ mã hóa mảng byte của bạn thành một chuỗi .Net mới mỗi khi bạn muốn thực hiện một kết quả phù hợp. Điều này có thể chứng minh là rất có ý nghĩa như tôi đã thấy nhiều một thuật toán trong Net cố gắng đi tại một triệu dặm một giờ chỉ để được đưa đến đầu gối của mình bằng thế hệ chuỗi và gửi thư rác đống tiếp theo và thời gian dành cho GC.
Rõ ràng đây là mã không an toàn, nhưng đó là .Net.
Kết quả của Regex sẽ tạo chuỗi mặc dù, do đó bạn gặp sự cố ở đây. Tôi không chắc chắn nếu có một cách sử dụng Regex sẽ không tạo ra các chuỗi mới. Bạn chắc chắn có thể nhận được thông tin về chỉ số và độ dài phù hợp nhưng việc tạo chuỗi vi phạm các yêu cầu của bạn về hiệu quả bộ nhớ.
Cập nhật
Trên thực tế sau khi tháo Regex \ Match \ Group \ Capture, có vẻ như nó chỉ tạo ra các chuỗi bắt khi bạn truy cập vào các tài sản giá trị gia tăng, vì vậy bạn có thể ít nhất là không được tạo ra chuỗi nếu bạn chỉ truy cập chỉ mục và thuộc tính độ dài. Tuy nhiên, bạn sẽ tạo ra tất cả các đối tượng Regex hỗ trợ.
Bạn có thể cung cấp ví dụ về mẫu RegEx bạn đang cố gắng khớp không? –
@Nate Dudek, tôi không thấy nó có liên quan như thế nào. Tôi đang tìm một thư viện regex chung vì tôi đang cố phân tích các giao thức internet phức tạp. Không phải là một regex cụ thể. Nếu bạn thực sự cần một ví dụ, hãy xem http://www.ietf.org/rfc/rfc2616.txt cho regex khác ở đó (nó cũng tham chiếu đến các rfcs khác) – brickner
Thực ra, .NET không hỗ trợ đầu vào nhị phân cho Cụm từ thông dụng. Tôi hiểu rằng bạn không muốn mất thời gian tính toán trong chuyển đổi, nhưng nếu các ký tự đặc biệt là nỗi sợ duy nhất của bạn, bạn có thể chuyển đổi byte thành chuỗi mà không gặp sự cố. Chuỗi .NET được mã hóa bằng Unicode UTF-16. Tất cả các ký tự sẽ được hỗ trợ. – Ucodia