Thứ nhất, Hủy bỏ tất cả characeters đặc biệt:
var fixedInput = Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty);
// This regex doesn't support apostrophe so the extension method is better
Sau đó chia nó:
var splitted = fixedInput.Split(' ');
Đối với một C giải pháp # đơn giản để loại bỏ ký tự đặc biệt (mà bạn có thể dễ dàng thay đổi), thêm phương pháp mở rộng này (tôi đã thêm một sự hỗ trợ cho một dấu nháy đơn):
public static string RemoveSpecialCharacters(this string str) {
StringBuilder sb = new StringBuilder();
foreach (char c in str) {
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '\'') {
sb.Append(c);
}
}
return sb.ToString();
}
Sau đó, sử dụng nó như vậy:
var words = input.RemoveSpecialCharacters().Split(' ');
Bạn sẽ được surpr ised biết rằng phương pháp mở rộng này rất hiệu quả (chắc chắn hiệu quả hơn thì Regex) vì vậy tôi sẽ đề nghị bạn sử dụng nó;)
Cập nhật
Tôi đồng ý rằng đây là một cách tiếp cận chỉ tiếng Anh nhưng để làm cho nó tương thích Unicode tất cả các bạn phải làm là thay thế:
(c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
với:
char.IsLetter(c)
nào suppor ts Unicode,.Net Ngoài ra cung cấp cho bạn char.IsSymbol
và char.IsLetterOrDigit
cho sự đa dạng của các trường hợp
Nguồn
2013-05-24 00:06:11
Lời khuyên của tôi: bắt đầu bằng cách xác định ngữ pháp từ vựng rõ ràng và sau đó viết lexer cho ngữ pháp tạo ra một chuỗi mã thông báo. Sau đó, từ chối các thẻ không được lexed vào sản xuất "từ". Đây không phải là một công việc cho các biểu thức thông thường. –
Tôi thực sự thích phản ứng của Eric. Tôi biết tôi đến muộn một chút, nhưng đó là cách tốt nhất để đi. –
Tôi đã thu thập tất cả dấu phân cách ** ở trên và tôi đã tìm thấy nội dung nào đó như kết quả này.Split ({"'", "", ",",, ":" ",". ",".' "} , StringSplitOptions.RemoveEmptyEntries); –