Trong nhiều trường hợp bạn cần xử lý chuỗi theo một cách mà lớp String không hỗ trợ. Bạn có thể tự viết các hàm xử lý chuỗi cần thiết và tạo ra một thư viện dạng .dll (Dynamic Link Library : Thư viện liên kết động) để thêm vào ứng dụng khi cần thiết.
Cách viết các đoạn mã dưới đây tương đối dễ hiểu, tôi chỉ giải thích một số phần cần thiết.
Viết mã nguồn
1) Chuyển chuỗi về dạng Title Case
Mô tả: In hoa các kí tự đầu tiên của mỗi từ.
-Input: Chào mừng bạn-Output: Chào Mừng Bạn
Code:
123456789101112 public static string ToTitleCase(string str){s = s.ToLower();char[] charArr = s.ToCharArray();charArr[0] = Char.ToUpper(charArr[0]);foreach (Match m in Regex.Matches(s, @”(\s\S)”)){charArr[m.Index + 1] = m.Value.ToUpper().Trim()[0];}return new String(charArr);}
Để thực hiện trước tiên ta chuyển chuỗi sang chữ thường bằng phương thức ToLower(). Sao đó tiếp tục chuyển chuỗi thành một mảng char để dễ dàng thay đổi từng kí tự. Trước khi vào vòng lặp chính, ta cần chuyển kí tự đầu tiên thành chữ hoa bằng dòng lệnh
1 |
charArr[0] = Char.ToUpper(charArr[0]); |
Vòng lặp chính như bạn có thể thấy, nó sẽ tìm tất cả các kí tự đứng sau khoảng trắng và chuyển thành chữ hoa.
1 2 3 4 |
foreach (Match m in Regex.Matches(s, @”(\s\S)”)) { charArr[m.Index + 1] = m.Value.ToUpper().Trim()[0]; } |
Phương thức này sử dụng lớp Regex (viết tắt của Regular Expressions – tạm dịch là Biểu thức chính quy) trong namespace System.Text.RegularExpressions để tìm kiếm trong chuỗi truyền vào. Chuỗi pattern “\s\S” sẽ tìm kiếm các kí tự đứng sau khoảng trắng hoặc kí tự đầu câu.
Nếu cảm thấy cách làm trên khá phức tạp, bạn có thể thử cách sau, tương đối ngắn gọn và dễ hiểu hơn:
1 2 3 4 5 6 7 8 |
private string ToTitleCase(string input) { input = input.ToLower(); input = ” ” + input; foreach(Match m in Regex.Matches(input,@”\s\S”)) input=input.Replace(m.Value,m.Value.ToUpper()); return input.Substring(1); } |
Việc thêm khoảng trắng đầu chuỗi để chắc rằng kí tự đầu tiên không bị bỏ sót khi so khớp, cuối phương thức khoảng trắng dư này sẽ được cắt bỏ bằng Substring().
Mô tả: Chuyển các kí tự hoa thành thường và ngược lại
-Input: Chào mừng bạn ĐếN với StanFord-Output: cHÀO MỪNG BẠN đẾn VỚI sTANfORDCode:
12345678910111213 public static string ToToggleCase(string str){string ret=””;foreach (char c in str){string s = c.ToString();if (s==s.ToLower())ret += s.ToUpper();elseret += s.ToLower();}return ret;}
3) Chèn một chuỗi vào chuỗi nguồn (tính từ trái hoặc phải)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public static string Insert(string input,string value,int startIndex,bool rightToLeft) { if (rightToLeft) { if (startIndex > input.Length) startIndex = 0; else startIndex = input.Length – startIndex; } else { if (startIndex > input.Length) startIndex = input.Length; } return input.Insert(startIndex, value); } |
Trong các phương thức này thay vì kiểm tra và thay đổi các giá trị của tham số, bạn có thể ném ra một ngoại lệ.
4) Xóa một chuỗi từ chuỗi nguồn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public static string Remove(string input,int startIndex,int count, bool rightToLeft) { try { if (rightToLeft) { if (startIndex > input.Length) startIndex = 0; else startIndex = input.Length – startIndex-count; } else { if (startIndex > input.Length) startIndex = input.Length; } startIndex = startIndex< 0 ? 0 : startIndex; if (count > input.Length) count = input.Length; else count = count < 0 ? 0 : count; return input.Remove(startIndex, count); } catch(Exception ex) { throw ex; } } |
5) Thay thế một chuỗi con
Normal 0 false false false MicrosoftInternetExplorer4
1234567891011 public static string Replace(string input,string oldValue, string newValue, bool matchCase){RegexOptions regexOption=RegexOptions.None;if (!matchCase){regexOption= RegexOptions.IgnoreCase;}Regex regex = new Regex(oldValue,regexOption);input = regex.Replace(input, newValue);return input;}Phương thức không làm gì khác ngoài việc sử dụng phương thức Replace của lớp Regex để thay thế. Nếu bạn thấy phương thức này không cần thiết, có thể loại bỏ khỏi lớp StringToolkit của bạn.
6) Loại bỏ các dấu tiếng Việt khỏi chuỗi
Một phương thức sử dụng Regex bằng cách tìm tất cả các kí tự tiếng Việt có dấu và thay thế bằng kí tự không dấu tương ứng. Bạn có thể thấy tôi đặt kí tự không dấu ở đầu mỗi chuỗi pattern. Việc lặp qua từng pattern sẽ tìm và thay thế các kí tự tìm thấy bằng kí tự đầu tiên của chuỗi pattern đó.
Đây là một cách viết nhanh chóng để thay thế với số lượng lớn các chuỗi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static string RejectMarks(string text) { string[] pattern= new string[7]; pattern[0] = “a|(á|ả|à|ạ|ã|ă|ắ|ẳ|ằ|ặ|ẵ|â|ấ|ẩ|ầ|ậ|ẫ)”; pattern[1]= “o|(ó|ỏ|ò|ọ|õ|ô|ố|ổ|ồ|ộ|ỗ|ơ|ớ|ở|ờ|ợ|ỡ)”; pattern[2] = “e|(é|è|ẻ|ẹ|ẽ|ê|ế|ề|ể|ệ|ễ)”; pattern[3] = “u|(ú|ù|ủ|ụ|ũ|ư|ứ|ừ|ử|ự|ữ)”; pattern[4] = “i|(í|ì|ỉ|ị|ĩ)”; pattern[5] = “y|(ý|ỳ|ỷ|ỵ|ỹ)”; pattern[6] = “d|đ”; for (int i = 0; i < pattern.Length; i++) { // kí tự sẽ thay thế char replaceChar = pattern[i][0]; MatchCollection matchs = Regex.Matches(text,pattern[i]); foreach (Match m in matchs) { text = text.Replace(m.Value[0],replaceChar); } } return text; } |
Trên đây chỉ là các ví dụ đơn giản, bạn có thể có các cách viết khác tối ưu hơn và có thể tạo thêm cho mình các phương thức xử lý khác. Tuy nhiên, trong một chừng mực nào đó, phương thức của bạn không nên “ôm đồm” quá nhiều tham số và chức năng để xử lý. Cảm ơn các bạn đã đọc bài này!