C# – Các phương pháp xử lý chuỗi nâng cao

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.

Trong bài viết này  tạo ra một lớp StringToolkit chứa các phương thức static để xử lý chuỗi theo các yêu cầu thường gặp khi lập trình. Bạn có thể chọn kiểu dự án là ClassLibrary hoặc gán Output type là Class Library để tạo ra file .dll.

Sau khi đọc xong các phương thức này bạn có thể nhận ra là nó hoàn toàn là nâng cao như tiêu đề đã viết. Đây chỉ là một cách viết để ta không bị nhầm lẫn với các phương thức của lớp string.

Cách viết các đoạn mã dưới đây tương đối dễ hiểu.

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 ĐếN  HaNoi aptech

-Output:          Chào Mừng Đến Hanoi Aptech

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, @”(sS)”))
{
charArr[m.Index + 1] = m.Value.ToUpper().Trim()[0];
}

return new String(charArr);
}

Ý tưởng thực hiện là đầu tiên ta sẽ chuyển chuỗi về chữ thường, sau đó tìm kiếm các kí tự đứng sau một khoảng trắng bất kì, rồi thay thế kí tự này bằng kí tự in hoa của nó.

Để 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

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.

foreach (Match m in Regex.Matches(s, @”(sS)”))
{
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 “sS” 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:

private string ToTitleCase(string input)
{
input = input.ToLower();
input = ” ” + input;
foreach(Match m in Regex.Matches(input,@”sS”))
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().

(* “s” đại diện cho kí tự khoảng trắng)
* “S” đại diện cho mọi kí tự trừ khoảng trắng)
* “^” kí tự đầu dòng
* “.” Mọi kí tự trừ kí tự xuống dòng
*** Vì Regular Expressions là một chủ đề lớn tương đối phức tạp, nó được sử dụng trong nhiều phần mềm và ngôn ngữ lập trình để phục vụ tìm kiếm hoặc xử lý văn bản. Bạn có thể tìm kiếm các chủ đề hướng dẫn về Regular Expressions trên mạng hoặc sách vở trước khi cảm thấy thích thú với nó.)
2) Chuyển chuỗi sang dạng Toggle Case

Mô tả: Chuyển các kí tự hoa thành thường và ngược lại

-Input:                         Chào mừng ĐếN HaNoi aptech

-Output:          cHÀO MỪNG đẾn hAnOI APTECH

public static string ToToggleCase(string str)

{

string ret=””;

foreach (char c in str)

{

string s = c.ToString();

if (s==s.ToLower())

ret += s.ToUpper();

else

ret += 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)

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

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

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.

public static string RejectMarks(string text)

{

string[] pattern= new string[7];

pattern[0] = “a