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 graygrey. 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.

Tìm hiểu thêm về Dot

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.

Tìm hiểu thêm về Anchor

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.

Tìm hiểu thêm về Alternation

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.

Tìm hiểu thêm về Repetition

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ó.

Tìm hiểu thêm về Named Group

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à 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ữ qkhô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.

Tìm hiểu thêm về Lookaround

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.

Tìm hiểu thêm về Unicode