Phần 1: Các lệnh xử lý chuỗi thông thường
Trong thao tác với chuỗi ký tự, nhu cầu xử lý chuỗi, tìm kiếm, thay thế thật đa dạng và thật khó có một hướng dẫn nào đáp ứng được hết yêu cầu. Hôm nay, tôi xin phép được viết một cách tóm tắt về chuỗi, xử lý chuỗi với một công cụ tương đối mạnh đó là RegEx.
Trước khi đi vào công cụ này, ta hãy dừng chút thời gian với các cách làm hiện tại:
1. Bộ lệnh và hàm thông thường trong xử lý chuỗi.
Có nhiều nhóm hàm khác nhau nhưng những hàm nổi tiếng phải nói đến là (dấu * có ý là tham số không bắt buộc - optional):
+ Nhóm trích xuất số liệu
- LEFT([Str: Chuỗi cần xử lý],[Length: Chiều dài chuỗi cần lấy]): Trích lấy đoạn ký tự có chiều dài Length từ phía trái đoạn ký tự ban đầu Str.
- RIGHT([Str: Chuỗi cần xử lý],[Length: Chiều dài chuỗi cần lấy]): Tương tự hàm LEFT nhưng lấy từ bên phải
- MID([Str: Chuỗi cần xử lý],[Start: Ký tự bắt đầu trong chuỗi],[*Length: Chiều dài chuỗi cần xử lý]): Trả về chuỗi có chiều dài là Length bắt đầu từ ký tự Start trong chuỗi ban đầu Str. Nếu bỏ qua tham số Length, hàm này sẽ trả về phần còn lại của chuỗi bắt đầu từ ký tự số Start.
+ Nhóm tìm kiếm, kiểm tra, thay thế
- INSTR([*Start: số thứ tự ký tự bắt đầu của chuỗi gốc],[String1: Chuỗi gốc],[String2: chuỗi cần tìm trong chuỗi gốc],[*Compare: cách so sánh chuối, có 2 chế độ - so sánh dạng Text thông thường hoặc so sánh dạng nhị phân]): Trả về giá trị số đặc tả vị trí đầu tiên bắt đầu phát hiện được chuỗi String2 có trong chuỗi String1. Nếu không tìm thấy sẽ trả về 0.
Hàm INSTR là tìm xuôi từ đầu chuỗi và ngược lại có hàm INSTRREV tìm ngược từ cuối chuỗi.
- INSTRREV([StringCheck: Chuỗi cần kiểm tra],[StringMatch: Chuỗi cần tìm],[*Start: Điểm bắt đầu tìm kiếm tính từ bên trái, nếu bỏ qua, hàm sẽ tìm từ vị trí cuối cùng bên phải chuỗi kiểm tra và giảm dần từ phải qua trái],[*Compare: tương tự như Instr])
- REPLACE(
[Expression: Chuỗi có chứa chuỗi con cần thay thế], [Find: Chuỗi con cần tìm để thay thế], [Replacement: Chuỗi thay thế cho chuỗi con],[*Start: Vị trí trong chuỗi tìm kiếm ấn định chỗ bắt đầu tìm, nếu bỏ qua, hàm sẽ bắt đầu tìm từ 1],[*Count: Số lần thay thế cần thực hiện. Nếu bỏ qua, giá trị mặc định là -1 và hàm sẽ thay thế tất cả các chuỗi phát hiện được], [*Compare: tương tự như đối với các hàm Instr, InstrRev)
Vâng chỉ với bộ hàm này chúng ta đã có thể làm được rất nhiều việc trong xử lý chuỗi, đặc biệt là nhóm Instr/InstrRev và Replace. Chẳng hạn:
1. Lọc tên tập tin từ chuỗi chứa đường dẫn đầy đủ của tập tin:
Mã:
Function GetFileName(FullFileName As String) As String
On Error Resume Next
GetFileName = Mid(FullFileName, InStrRev(FullFileName, "\") + 1)
End Function
Ví dụ: chuỗi chứa đường dẫn đầy đủ là "C:\Program Files\7-Zip\7zG.exe"
Mã:
Debug.Print GetFileName("C:\Program Files\7-Zip\7zG.exe")
Kết quả sẽ là 7zG.exe
Hàm sẽ tìm từ bên phải đối với ký tự "\" và trả về vị trí tìm được đầu tiên, sau đó hàm Mid sẽ lấy luôn giá trị tìm được.
2. Đếm số lần xuất hiện chuỗi nào đó trong chuỗi cho trước
Cho 2 chuỗi
x = "html,xlsx,xltx,potx,ppsx,pptx,docx,dotx" ' liệt kê danh sách các phần đuôi của file
y = "text/html,Excel document,Excel Template,PowerPoint Template,PowerPoint Script,Word Document,Word Template" ' liệt kê phần mô tả kiểu file ứng với đuôi file ở trên.
Hãy tìm kiểu file tương ứng từ phần mở rộng của file mà không cần dùng tới vòng lặp
trong đa số các trường hợp, chúng ta sẽ luôn bắt đầu bằng việc xây dựng 2 mảng thông qua lệnh Split sau đó dùng vòng lặp để duyệt qua mảng chứa các phần tử của chuỗi 1 sau đó so sánh và trả về giá trị tương ứng ở mảng chứa các phần tử chuỗi 2.
Nếu không dùng vòng lặp thì làm thế nào? Các bạn hãy xem hàm sau đây (được dùng để trả về kiểu file tương ứng dựa vào phần mở rộng của file)
Mã:
Function GetMimeType(FileExtension As String) As String
Dim x As String, y As string, z As String, xPos As Long
Dim tmpStr As String
x = "html,xlsx,xltx,potx,ppsx,pptx,docx,dotx"
y = "text/html,Excel document,Excel Template,PowerPoint Template,PowerPoint Script,Word Document,Word Template"
xPos = InStr(x & ",", LCase(FileExtension) & ",") ' Các bạn chú ý tôi gắn thêm 1 dấu phẩy vào cuối chuỗi cần tìm
If xPos > 0 Then
' tìm được vị trí bắt đầu xuất hiện chuỗi
tmpStr = Left(x, xPos - 1)' lấy phần chuỗi gốc từ đấu đến vị trí tìm thấy
xPos = Len(tmpStr) - Len(Replace(tmpStr, ",", "")) ' đếm xem có bao nhiêu dấu phẩy bị thay thế và ứng với nó chính là số thứ tự của phần tử trong mảng ở câu lệnh ngay dưới đây
GetMimeType = Split(y,",")(xPos)
Else
GetMimeType = "application/vnd.google-apps.unknown"
End If
End Function
Đấy là một vài kiểu ví dụ. Các bạn có thể thấy là khá đủ để xử lý các công việc đơn giản với chuỗi. Nhưng với các yêu cầu khác như: tác riêng số ra khỏi chuỗi, tách riêng các đoạn ký tự nằm trong chuỗi đặc biệt nào đó ví dụ đối với chuỗi chứa văn bản HTML thì việc dùng các hàm này sẽ khó khăn hơn nhiều. Bài sau tôi sẽ trình bày về công cụ RegEx.
Xin chân thành cảm ơn