Bạn có 3 lựa chọn:
Làm điều này một cách hiệu quả với chuỗi như những người khác đã đề nghị ở đây.
Sử dụng gọi .Matches()
trên đối tượng Regex
của bạn và mô phỏng cách hoạt động .Replace()
(xem # 3).
Thích ứng việc thực hiện Mono của Regex
để xây dựng một Regex
chấp nhận StringBuilder
(và hãy chia sẻ nó ở đây!) Hầu như tất cả các công việc đã được thực hiện cho bạn trong Mono, nhưng nó sẽ mất thời gian để Suss ra những phần làm cho nó hoạt động vào thư viện của riêng họ. Mono Regex
thúc đẩy triển khai JVM 2002 của Novell là Regex
, đủ kỳ quặc.
Trong Mono:
System.Text.RegularExpressions.Regex
sử dụng một RxCompiler
nhanh chóng một IMachineFactory trong hình thức của một RxInterpreterFactory
, mà gì ngạc nhiên làm cho IMachine
s như RxInterpreter
s. Bắt những người phát ra là hầu hết những gì bạn cần làm, mặc dù nếu bạn chỉ muốn tìm hiểu cách tất cả được cấu trúc để có hiệu quả, thì điều đáng chú ý là những gì bạn đang tìm kiếm nằm trong lớp cơ sở, BaseMachine
.
Cụ thể, trong BaseMachine
là công cụ StringBuilder
. Trong phương thức LTRReplace
, đầu tiên nó khởi tạo một StringBuilder với chuỗi ban đầu và mọi thứ từ đó trở đi hoàn toàn dựa trên StringBuilder. Nó thực sự rất khó chịu rằng Regex không có phương thức StringBuilder treo ra, nếu chúng ta giả định việc thực hiện Microsoft .Net nội bộ là tương tự.
Quanh trở lại gợi ý 2, bạn có thể bắt chước hành vi LTRReplace
's bằng cách gọi .Matches()
, theo dõi bạn đang ở đâu trong chuỗi ban đầu, và vòng lặp:
var matches = regex.Matches(original);
var sb = new StringBuilder(original.Length);
int pos = 0; // position in original string
foreach(var match in matches)
{
sb.Append(original.Substring(pos, match.Index)); // Append the portion of the original we skipped
pos = match.Index;
// Make any operations you like on the match result, like your own custom Replace, or even run another Regex
pos += match.Value.Length;
}
sb.Append(original.Substring(pos, original.Length - 1));
Nhưng, điều này chỉ giúp bạn tiết kiệm một số dây - các Cách tiếp cận mod-Mono là cách duy nhất thực sự làm đúng.
Nguồn
2014-07-30 05:46:49
Tôi ngạc nhiên vì tôi không nghĩ về điều này: thực sự chạy nó và thấy, thay vì suy đoán về tốc độ sẽ là gì. Tôi đã xóa câu trả lời đầu cơ của mình cho phù hợp. – Timwi
Nếu Regex.Replace đủ nhanh, tôi có nên quan tâm đến quản lý bộ nhớ không? Tôi có đang phân tích/tối ưu hóa mọi thứ bằng cách lo lắng về bộ nhớ over-head của việc tạo ra nhiều chuỗi không? – ipr101
Đây không phải là câu trả lời nhiều như gợi ý. Câu hỏi đặt ra là làm thế nào để làm cho regex làm việc với stringbuilder, và câu trả lời là chúng không tương thích trừ khi bạn viết thực hiện của riêng bạn. Tại sao đây là trường hợp tôi không biết. – Slight