Bạn từng thử tìm mẫu lặp lại trong đoạn văn bản? Bạn có thể dùng hàm tìm trong trình duyệt hoặc word processor, nhưng khi cần tìm cái phức tạp hơn, giống như tìm kim trong rổ rơm.
May mắn thay, có cách chọn lọc mẫu chính xác trong văn bản xuống tới ký tự. Nó gọi là regular expressions (RegEx), và nó cho phép bạn thành thạo tìm kiếm qua văn bản.
Tôi có thể dùng RegEx ở đâu?
Mặc dù Unix và Linux làm cho chúng phổ biến, regular expressions có sẵn trong nhiều gói, bao gồm Microsoft Word.
Regular expressions nổi bật nhất dùng trong một vài chương trình Linux đáng chú ý, bao gồm grep, Awk và Sed.
Ví dụ, bạn muốn kiểm tra thiết bị USB trên PC. Dùng lspci, bạn thấy danh sách tất cả thiết bị, và bạn phải tự tìm entry USB. Bạn có thể dùng thay thế:
lspci | grep "USB"
Đây là ví dụ đơn giản nhất của RegEx hoạt động. Đó là cách phổ biến nhất dùng regular expressions trong terminal nhưng không phải duy nhất. Hôm nay bạn tìm thấy hỗ trợ RegEx trong nhiều loại phần mềm khác nhau, từ trình soạn thảo đến trình quản lý tệp.
Tìm mẫu (Patterns)
Bạn có thể đã dùng ký tự *, đóng vai trò wildcard khi chọn tệp/thư mục trong terminal. Ví dụ, liệt kê tất cả file JPG trong thư mục:
ls *.jpg
Tương đương RegEx của trên:
ls | grep -E "\.jpg"
Để tìm cả jpg và png, dùng:
ls | grep -E "(\.jpg|\.png)"
Phạm vi (Ranges)
Nếu bạn muốn tìm phạm vi ký tự cụ thể thay vì mẫu, bạn làm bằng cách định nghĩa trong ngoặc vuông. Nếu, ví dụ, bạn dùng [a-z] làm mẫu, sẽ khớp bất kỳ chuỗi nào gồm chữ cái thường.
Như bạn đoán, [A-Z] chọn chỉ chữ hoa. Để chọn bất kỳ phạm vi chữ cái, cả hoa và thường, biểu thức thành [a-zA-Z].
Để định vị số lượng cụ thể của mẫu, bạn nói trong ngoặc nhọn. {5} trả về 5 lần xuất hiện mẫu. Bạn cũng dùng phạm vi số, nên {5,10} trình bày 5 đến 10 lần.
Metacharacters (Ký tự siêu)
Trong regular expressions, bạn cũng tìm phần chuỗi với hai ký tự gọi là metacharacters. Chúng giống wildcard match bạn dùng trong shell.
Chính là dấu chấm đơn giản, đại diện cho bất kỳ ký tự đơn nào. Nếu bạn dùng mẫu c.ll, nó khớp "cell" nhưng cũng "cull" và "call".
Bằng cách nhập dấu sao sau dấu chấm, bạn dùng nó khớp vô hạn ký tự. Ví dụ, .*board khớp cả "keyboard" và "skateboard", ngay cả khi "key" và "skate" có số chữ khác nhau.
Escape (Thoát)
Bạn có thể nhận thấy trong ví dụ chọn loại ảnh khác nhau, chúng tôi dùng backslash trước dấu chấm ("\.jpg"). Đó là cách bạn escape ký tự đặc biệt trong RegEx.
Nếu không dùng, mẫu không chỉ khớp đuôi tệp, chuỗi như ".jpg" và ".png", mà cũng khớp "ajpg" và "opng". Nhớ . là wildcard khớp bất kỳ ký tự.
Anchors và Boundaries (Neo và Ranh giới)
Anchors và boundaries cho phép định nghĩa chính xác hơn bạn tìm gì.
Để chỉ tìm từ đơn lẻ "computer", không ký tự khác trước/sau, định nghĩa mẫu như \<computer\>.
Bạn cũng tìm mẫu xuất hiện đầu hoặc cuối dòng. Đạt được bằng ký tự ^ và $ tương ứng.
Vậy, nếu muốn chỉ tìm entry từ "computer" xuất hiện đầu dòng, mẫu như ^computer. Ngược lại, khi ở cuối dòng, mẫu thành computer$.
Đó là quy tắc đơn giản RegEx, bạn cũng kết hợp để tìm chính xác mẫu bạn tìm. Bạn tìm phạm vi ký tự đầu dòng hoặc từ luân phiên cuối, ngày cụ thể, hoặc phạm vi năm, dùng một chuỗi văn bản đơn lẻ.
Đừng quên cheat sheet Regular Expressions của chúng tôi để thành thạo regular expressions.