Tham khảo nhanh Regex!
Phần huớng dẫn này sẽ giúp bạn hiểu nhanh regex với thời gian ngắn. Dĩ nhiên nó sẽ không giải thích cho bạn mọi thứ về regex. Để hiểu chi tiết hơn về regex, hãy tham khảo trang huớng dẫn hoàn chỉnh.
Mỗi chủ đề ở phần huớng dẫn nhanh này đều tuơng ứng với chủ đề đó ở huớng dẫn hoàn chỉnh, nên bạn có thể thao khảo thêm dễ dàng.
Thuật ngữ
Khớp (Matches): khi một biểu thức regex tìm thấy được kết quả.
Escape: regex sử dụng một số kí tự đặc biệt như +, *, \. Khi bạn muốn sử dụng những kí tự này như là chữ cứng, bạn phải escape - biến nó thành chữ thường.
Màu xanh biển mô tả biểu thức regex.
Màu xanh lá mô tả chuỗi chữ.
Màu xám mô tả kí tự cứng.
Màu đỏ mô tả kí tự regex đang được đề cập đến trong chủ đề.
Màu cam dùng để nhấn mạnh ý.
Literal Character - Chữ cứng
Câu regex cơ bản nhất chỉ có 1 kí tự, chẳng hạn như a. Nó sẽ khớp chữ a đầu tiên trong một đoạn chuỗi. Nếu đoạn chuỗi là Jack is a boy, nó sẽ khớp chữ a sau chữ J.
Regex có 12 kí tự đặc biệt của nó. Gạch xéo \, dấu ô ^, dấu dollar $, dấu chấm ., gạch thẳng |, dấu hỏi ?, dấu sao *, dấu cộng +, dấu mở ngoặc (, dấu đóng ngoặc ), ngoặc vuông [, ngoặc nhọn {. Những kí tự này đuợc gọi là "metacharacters". Phần lớn chúng bị lỗi nếu xài một mình.
Nếu bạn muốn sử dụng những kí tự này như là chữ cứng trong regex, bạn phải escape nó bằng dấu gạch xéo. Ví dụ bạn muốn khớp chuỗi 1+1=2, câu regex đúng sẽ là 1\+1=2. Nếu không escape thì kí tự dấu + sẽ có ý nghĩa riêng của nó.
Tìm hiểu thêm về Literal characters
Non-Printable Character - Kí tự không được in
Bạn có thể sử dụng chuỗi kí tự đặc biệt để thêm kí tự không in này vào regex của bạn. Sử dụng \t để khớp một kí tự tab (ASCII 0x09), \r cho kí tự carriage return (0x0D), \n cho kí tự xuống hàng (line feed, 0x0A). Những kí tự đặc biệt khác như \a (bell, 0x07), \e (escape, 0x1B), \f (form feed, 0x0C) và \v (tab dọc, 0x0B). Nhớ rằng Windows sử dụng \r\n để xuống dòng, còn UNIX sử dụng \n.
Nếu ứng dụng có hổ trợ Unicode, bạn có thể sử dụng \uFFFF hoặc \x{FFFF} để thêm kí tự đặc biệt. \u20AC hoặc \x{20AC} để khớp kí tự tiền tệ euro. Nếu ứng dụng không hổ trợ Unicode, sử dụng \xFF để khớp kí tự đặc biệt bằng mã index hexadecimal trong bộ character set. \xA9 khớp kí tự copyright trong bản character set Latin-1.
Tất cả Kí tự không in có thể sử dụng trực tiếp trong regex, hoặc là sử dụng như là một phần của Character class.
Tìm hiểu thêm về Non-Printable Characters
Character Class - Bộ kí tự
Character class sẽ khớp một trong nhiều kí tự đuợc chỉ định. Ví dụ để khớp chữ a hoặc e, bạn sử dụng [ae]. Bạn có thể sử dụng câu gr[ae]y để khớp đuợc cả chuỗi gray và grey. Một character class chỉ khớp đuợc một kí tự. gr[ae]y không thể khớp đuợc chuỗi graay hay graey. Thứ tự kí tự chỉ định trong character class không quan trọng. [ae] giống với [ea].
Bạn có thể sử dụng gạch ngang trong character class để chỉ định một dãy kí tự. [0-9] sẽ khớp một số giữa 0 và 9. Bạn có thể gộp chung nhiều dãy kí tự trong regex. [0-9a-fA-F] sẽ khớp một kí tự số hex (Ví dụ: 0xE).
Nếu bạn thêm dấu ^ sau dấu ngoặc vuông, bạn sẽ chỉ định một bộ kí tự bỏ qua. Có nghĩa là regex sẽ tìm những kí tự mà bạn không chỉ định trong Character class đó. Ví dụ qu[^a] sẽ khớp với chuỗi quy hay que và sẽ không khớp chuỗi qua.
Tìm hiểu thêm về Character Class
Shorthand Character Class - Bộ kí tự tiện ích
\d sẽ khớp một kí tự số, \w sẽ khớp một kí tự chữ (bao gồm chữ số và gạch duới), và \s sẽ khớp một kí tự khoản trắng (bao gồm kí tự tab và xuống hàng).
Tìm hiểu thêm về Shorthand Character Class
Using Dot - Sử dụng dấu chấm
Dấu chấm . sẽ khớp bất kì kí tự nào, ngoại trừ kí tự xuống hàng.
gr.y sẽ khớp với gray, grey, gr%y, v.v. Chỉ sử dụng dấu chấm khi cần thiết. Thuờng thì sử dụng Character class sẽ chính xác và tuờng minh hơn.
Anchor
Anchor không dùng để tìm một kí tụ, nó dùng để khớp một vị trí. ^ sẽ khớp vị trí đầu của chuỗi, và $ sẽ khớp vị trí cuối của chuỗi. Phần lớn các regex sẽ có chức năng "multi-line" cho phép dấu ^ khớp sau kí tự xuống dòng, và $ khớp trước kí tự xuống dòng. Ví dụ ^b chỉ khớp chữ b đầu tiên trong chuỗi bob.
\b sẽ khớp với một từ. Một từ được định nghĩa từ vị trí có thể khớp bởi \w đến vị trí không thể khớp bởi \w. Ví dụ: \bis\b sẽ chỉ khớp với chữ is thứ 3 trong chuỗi This island is beautiful.
Alternation
Alternation trong regex giống với câu lệnh "or". cat|dog sẽ khớp chữ cat trong chuỗi About cats and dogs. Nếu search tiếp, nó sẽ khớp chữ dog. Bạn có thể thêm nhiều định nghĩa tùy thích: cat|dog|mouse|fish.
Alternation có độ ưu tiên thấp nhất trong regex. cat|dog food sẽ khớp cat hoặc dog food. Nếu bạn muốn tạo câu regex để khớp được cả chuỗi cat food hoặc dog food, bạn cần phải sử dụng chức năng group (gộp nhóm): (cat|dog) food.
Repetition - Lập lại
Dấu hỏi ? sẽ cho phép kí tự trước đó có thể xuất hiện hoặc không. colou?r sẽ khớp được cả colour hoặc color.
Dấu sao * sẽ chỉ định kí tự trước đó có thể xuất hiện không hoặc nhiều lần.
Dấu cộng + sẽ chỉ định kí tự trước đó có thể xuất hiện một hoặc nhiều lần.
<[A-Za-z][A-Za-z0-9]*> sẽ khớp với một tag HTML không có thuộc tính. Ví dụ: <h2>, <label>.
Sử dụng ngoặc nhọn để chỉ định số lần lập. Dùng [1-9][0-9]{3} để khớp một số từ 1000 đến 9999. Dùng [1-9][0-9]{2,4} để khớp một số từ 100 đến 99999.
Greedy và Lazy Repetition
Câu lệnh Repetition là dạng câu greedy (Tham lam). Có nghĩa là nó sẽ khớp cho đến khi nào nó không thể khớp được nữa thôi, thay vì trả về kết quả đầu tiên thỏa điều kiện. Câu regex <.+> sẽ khớp toàn bộ <EM>first</EM> trong chuỗi This is a <EM>first</EM> test.
Đặt dấu hỏi ? phía sau Repetition sẽ làm cho nó lazy (Làm biếng). <.+?> sẽ chỉ khớp <EM> trong chuỗi trên.
Một giải pháp tốt hơn là sử dụng không sử dụng Dot. Sử dụng câu regex <[^<>]+> để tìm một tag HTML nhanh và tường minh hơn.
Tìm hiểu thêm về Greedy và Lazy Repetition
Grouping và Capturing
Bao quanh biểu thức bằng ngoặc tròn ( ) để group chúng lại với nhau. Bạn có thể sử dụng dấu lập lại hay tùy chọn với group. Ví dụ: Set(Value)? khớp Set hoặc SetValue.
Ngoặc tròn sẽ tạo ra một group. Ví dụ ở trên chỉ có một group. Group 1 sẽ không có gì nếu nó khớp chuỗi Set. Group 1 sẽ chứa Value nếu nó khớp chuỗi SetValue.
Sử dụng kí tự đặc biệt Set(?:Value)? để group biểu thức lại mà không tạo ra một group. Việc này thuận tiện khi bạn không cần sử dụng giá trị của group.
Tìm hiểu thêm về Grouping và Capturing
Backreference
Trong regex, bạn có thể sử dụng \1 để truy vấn giá trị vừa khớp được trong group. ([abc])=\1 sẽ khớp a=a, b=b, và c=c. Nếu câu regex của bạn có nhiều group, số thứ tự truy vấn sẽ đếm từ trái qua phải.
Tìm hiểu thêm về Backreference
Named Group
Nếu câu regex của bạn có nhiều group, việc nhớ thứ tự của group sẽ rất khó. Để dễ dàng hơn thì regex cho phép bạn đặt tên group. Câu (?<mygroup>[abc])=\k<mygroup> giống với câu ([abc])=\1, nhưng bạn có thể gọi group bằng tên của nó.
Lookaround
Lookaround là một loại group đặc biệt. Nó không trả về kết quả khớp mà dùng để chỉ định một vị trí như là Anchor.
q(?=u) sẽ khớp chữ q trong chuỗi question, nhưng sẽ không khớp trong chuỗi Iraq. Đây là lookahead. Chữ u sẽ không nằm trong kết quả của regex, nó dùng để chỉ định điều kiện tìm kiếm. Trong ví dụ này nó sẽ tìm chữ q nào mà có chữ u nằm trước nó.
q(?!u) sẽ khớp chữ q trong chuỗi Iraq, nhưng không khớp trong chuỗi question. Đây là negative lookahead. Ngược lại với lookahead, nó sẽ tìm chữ q mà không có chữ u nằm trước nó.
Để tìm chữ nằm sau, bạn sử dụng lookbehind. Câu (?<=a)b khớp với chữ b trong chuỗi abc vì chữ b có chữ a nằm trước nó. Câu negative lookbehind (?<!a)b sẽ không khớp được với chuỗi abc.
Bạn có thể chèn cả một câu regex bên trong lookahead. Nhưng một số ứng dụng sẽ giới hạn regex trong lookbehind.
Unicode
\p{L} sẽ khớp một kí tự trong bảng mã Unicode. L có nghĩa là letter. \P{L} sẽ khớp một kí tự không có trong bảng mã Unicode. Bạn có thể xem đầy đủ Bảng mã Unicode trong hướng dẫn hoàn chỉnh.