1. Tìm kiếm chuỗi con trong chuỗi
Ở bài trước bạn đã học cách lấy chuỗi con từ chuỗi. Còn ở bài này tụi mình sẽ học cách tìm một chuỗi trong chuỗi khác. Có 5 method xịn sò cho việc này:
Method Contains: chuỗi có chứa chuỗi con không?
Trả về true nếu chuỗi truyền vào có nằm trong chuỗi gọi method này.
string phrase = "Gió thay đổi";
bool hasWord = phrase.Contains("thay đổi"); // true
Tìm kiếm có phân biệt hoa thường nha! "gió".Contains("G") — false.
Method IndexOf: tìm vị trí chuỗi con
Rất giống với IndexOf trong mảng: tìm chuỗi con trong chuỗi (từ đầu đến cuối) và trả về index lần xuất hiện đầu tiên của chuỗi con.
string text = "dua hấu dua hấu";
int index = text.IndexOf("hấu"); // 2
- Nếu không tìm thấy gì, trả về -1.
- Có thể truyền thêm vị trí bắt đầu: IndexOf("hấu", 4). Y chang như trong mảng luôn.
Method LastIndexOf: lần xuất hiện cuối cùng
Cũng giống như LastIndexOf trong mảng: tìm chuỗi con trong chuỗi (từ cuối về đầu) và trả về index lần xuất hiện đầu tiên của chuỗi con tính từ cuối.
string repeated = "bài tập bài tập";
int last = repeated.LastIndexOf("bài tập"); // 7
Bắt đầu/kết thúc chuỗi bằng chuỗi con cho trước
Cũng hay cần kiểm tra xem chuỗi của mình có bắt đầu (hoặc kết thúc) bằng chuỗi con nào đó không. Có hai method cho việc này:
- StartsWith — kiểm tra chuỗi bắt đầu bằng chuỗi con nào đó;
- EndsWith — kiểm tra chuỗi kết thúc bằng chuỗi con cho trước.
string fileName = "photo.jpg";
bool isJpg = fileName.EndsWith(".jpg"); // true
string email = "support@company.com";
bool isSupport = email.StartsWith("support"); // true
Nếu muốn so sánh không phân biệt hoa thường, truyền thêm tham số chỉ định chế độ so sánh (xem docs về StringComparison.OrdinalIgnoreCase).
2. Method Replace: thay thế ký tự và chuỗi con
Method Replace thay tất cả các lần xuất hiện của chuỗi A thành chuỗi B. Sinh ra để xử lý lỗi gõ, kiểm duyệt và thay biến trong template! (Đùa thôi.)
string address = "London, phố Baker";
string updated = address.Replace("London", "Paris");
Console.WriteLine(updated); // "Paris, phố Baker"
- Có thể thay cả ký tự riêng lẻ: str.Replace('a', 'z')
- Lưu ý: tất cả các lần xuất hiện đều được thay, không chỉ lần đầu tiên.
3. Method Split: cắt chuỗi thành từng phần
Method Split làm như sau: lấy chuỗi của bạn và cắt nó thành các phần, dùng separator — ký tự hoặc chuỗi để chia. Method trả về mảng chuỗi đã cắt từ chuỗi gốc.
string[] parts = originalString.Split(separator);
- separator — ký tự hoặc mảng ký tự sẽ dùng làm dấu chia.
Ví dụ đơn giản nhất
Cắt chuỗi theo dấu cách:
string input = "táo lê cam chuối";
string[] fruits = input.Split(' '); // chứa mảng ["táo","lê","cam","chuối"]
Console.WriteLine(fruits[0]); // "táo"
Console.WriteLine(fruits[1]); // "lê"
Ở đây tụi mình nhận được mảng chuỗi dài 4, mỗi từ là một phần tử riêng.
Nhiều dấu chia
Đôi khi trong chuỗi không chỉ có một loại dấu chia. Ví dụ, user có thể nhập giá trị bằng dấu cách, dấu phẩy hoặc dấu chấm phẩy.
Lúc này có thể dùng mảng ký tự làm dấu chia:
string input = "táo, lê; cam chuối";
char[] separators = { ' ', ',', ';' };
string[] fruits = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
Bonus: tham số tuỳ chọn StringSplitOptions.RemoveEmptyEntries sẽ loại bỏ các phần rỗng. Cái này cần nếu user nhập nhiều dấu chia liền nhau — ví dụ hai dấu cách hoặc kiểu như "táo,, lê".
Cắt theo chuỗi con
Dấu chia có thể là chuỗi, không chỉ ký tự. Ví dụ, nếu bạn có file CSV với dấu chia là ";" hoặc |:
// Dấu chia là một ký tự
string data = "Ivanov;Petrov;Sidorov";
string[] names = data.Split(';'); // theo ký tự ';'
// Hoặc nếu dấu chia là cả chuỗi:
string log = "2024-01-01::Lỗi::Không thực hiện được bài tập";
string[] separators = { "::" };
string[] parts = log.Split(separators);
4. Method Join: ghép mảng chuỗi lại
Method Join làm ngược lại: nhận mảng chuỗi và ghép lại thành một chuỗi, chèn dấu chia bạn chọn giữa các phần tử.
string result = string.Join(separator, arrayOfStrings);
- separator — chuỗi sẽ được chèn giữa các phần tử.
- arrayOfStrings — mảng hoặc collection chuỗi (string[], List<string> v.v.).
Ví dụ đơn giản nhất
Tạo một chuỗi từ mảng chuỗi, ngăn cách bằng dấu phẩy:
string[] items = { "táo", "lê", "cam", "chuối" };
string joined = string.Join(", ", items);
Console.WriteLine(joined); // "táo, lê, cam, chuối"
Ghép với dấu chia rỗng — nối chuỗi liền nhau
Đôi khi chỉ muốn ghép chuỗi liền nhau, không chèn gì giữa chúng:
string[] parts = { "Tôi", "yêu", "C#" };
string message = string.Join("", parts);
Console.WriteLine(message); // "TôiyêuC#"
5. Lỗi phổ biến
Rất nhiều bạn mới học hay quên xoá khoảng trắng thừa sau khi tách chuỗi bằng Split. Ví dụ, nếu user gõ "táo, lê ,chuối", sau Split sẽ có phần tử kiểu " lê ". Nếu convert sang số hoặc so sánh, sẽ bị bug. Hãy dùng Trim() sau Split cho từng phần tử — thói quen tốt đó.
Thứ hai — phần tử rỗng thừa. Khi user nhập hai dấu chia liền nhau hoặc bắt đầu/kết thúc chuỗi bằng dấu chia, Split có thể trả về phần tử rỗng. Bật StringSplitOptions.RemoveEmptyEntries để tránh lỗi sau này.
Nếu mảng cho Join có phần tử rỗng hoặc null, Join sẽ bỏ qua. Nhưng nếu bạn không muốn vậy (ví dụ báo cáo cần hiển thị giá trị bị bỏ qua), phải xử lý mảng thủ công trước.
Và nữa: Split không bao giờ thay đổi chuỗi gốc, mà trả về mảng mới. Join cũng không thay đổi mảng gốc, mà trả về chuỗi mới. Nhớ nhé: chuỗi và mảng trong C# là immutable (không thay đổi được).
GO TO FULL VERSION