Bạn có thể sử dụng
Regex.Replace(myString, @"[^\x20-\xaf]+", "");
Các regex ở đây bao gồm một lớp nhân vật ([...]
) bao gồm tất cả các nhân vật không (^
vào lúc bắt đầu của lớp) trong khoảng từ U + 0020 đến U + 00AF (32–175, được biểu thị bằng ký hiệu thập lục phân). Theo như các biểu thức thông thường, điều này là khá cơ bản, nhưng có thể khiến ai đó không quen thuộc với nó.
Nhưng bạn có thể đi con đường khác cũng như:
new string(myString.Where(c => (c >= 32) && (c <= 175)).ToArray());
này có lẽ phụ thuộc chủ yếu vào những gì bạn cảm thấy thoải mái hơn với việc đọc sách. Nếu không có nhiều kinh nghiệm regex tôi muốn nói thứ hai sẽ rõ ràng hơn.
Một vài phép đo hiệu suất, 10000 vòng mỗi, chỉ trong vài giây:
2000 characters, the first 143 of which are between 32 and 175
Regex without + 4.1171
Regex with + 0.4091
LINQ, where, new string 0.2176
LINQ, where, string.Join 0.2448
StringBuilder (xanatos) 0.0355
LINQ, horrible (HatSoft) 0.4917
2000 characters, all of which are between 32 and 175
Regex without + 0.4076
Regex with + 0.4099
LINQ, where, new string 0.3419
LINQ, where, string.Join 0.7412
StringBuilder (xanatos) 0.0740
LINQ, horrible (HatSoft) 0.4801
Vì vậy, có, cách tiếp cận của tôi là :-) chậm nhất. Bạn có lẽ nên đi với câu trả lời của xanatos và bọc nó trong một phương pháp với một cái tên đẹp, rõ ràng. Đối với việc sử dụng nội tuyến hoặc những điều nhanh chóng và bẩn thỉu hoặc nơi hiệu suất không quan trọng, tôi có thể sử dụng regex.
Bạn có thể không chỉ xóa chúng bằng cách lập chỉ mục chuỗi bình thường không? Chuỗi đích có thể được phân bổ như chiều dài giống như chuỗi nguồn vì nó được bảo đảm là có cùng độ dài hoặc ngắn hơn. Sau đó, chỉ cần sao chép các ký tự hợp lệ trong một vòng lặp? Nó chỉ là hai so sánh để kiểm tra hợp lệ. –
Và một bản sao của 'char []' bởi vì chuỗi sẽ có cùng độ dài như trước, chỉ với 0-padding theo cách đó. – Joey