Giap Hiep

I'm Giap Hiep

I'm a web developer, a gymer. I enjoy share something i know that help people's work!
Giap Hiep

Nếu bạn chưa biết về Regex

Overview

Regular expressions là một cách để thực hiện khớp mẫu trên văn bản. Các lập trình viên thường bỏ qua và hầu hết họ nghĩ nó là một cái gì đó khó học.

Mặc dù, thực tế Regular expressions rất mạnh mẽ, nhưng rất nhiều lập trình viên đã không thực sự hiểu biết khi nhắc đến nó.

Một trong những ứng dụng rõ ràng nhất của Regex là tìm kiếm đoạn văn bản nhất định trong một codebase lớn. Nếu bạn là một nhà phát triển web, bạn có thể đã sử dụng nó trong việc xác thực dữ liệu người dùng (ví dụ nhu email). Thậm chí, các biểu thức regex có thể được sử dụng để loại bỏ các chuỗi nhất định.

Regular expressions rất mạnh mẽ, và đó thực sự là lý do tại sao nó lại là một điều tốt để làm quen. Để trở thành một lập trình viên giỏi, hiểu biết về Regex là rất cần thiết.

Trong bài viết này, chúng ta sẽ làm quen với những điều cơ bản của Regex. Cùng với lý thuyết, những kiến thức cơ bản về Regex sẽ được thể hiện bằng cách kết hợp các ví dụ.

Starting

Ví dụ bạn đang muốn tìm một chuỗi nhất định trong văn bản. Để tìm kiếm chuỗi hij trong văn bản, chúng ta sử dụng Regex sau: /hij/. Lưu ý rằng, chuỗi được bao quanh bởi dấu forward slashes (/.../). Chúng chỉ ra sự bắt đầu và kết thúc của biểu thức Regex.

Như bạn có thể nhìn thấy ở phía dưới, chúng ta có một kết quả phù hợp. Tìm kiếm này có phân biệt chữ hoa, chữ thường và chỉ trả về kết quả phù hợp đầu tiên.

Bạn muốn làm một thứ gì đó phức tạp hơn một chút so với ví dụ trước. Một trong những điều bạn có thể muốn là tìm kiếm một chuỗi bắt đầu bằng một số ký tự nhất định.

Hãy tạo một Regex khớp với abc khi bắt đầu chuỗi. Để làm điều đó, chúng ta sẽ thêm prefix vào biểu thức Regex với một ký tự ^ - Biểu thức Regex sẽ trở thành: /^abc/.

Chúng ta có thể làm tương tự nếu chúng ta muốn tìm một chuỗi khớp với các ký tự nhất định ở cuối chuỗi - nhưng chúng ta sẽ sử dụng suffix $ thay thế cho prefix ^. Biếu thức Regex như sau: /xyz$/.

Chúng ta cũng có thể kết hợp cả prefix và suffix để tìm kiếm kết quả khớp chuỗi chính xác:

Escaping

Có một số ký tự có ý nghĩa đặc biệt trong các biểu thức Regex. Những ký tự đó cần được escape trong biểu thực Regex.

Các ký tự đặc biệt:

[ \ ^ $ . | ? * + ( )

Ví dụ chúng ta cần tìm kiếm dấu ?. Do dấu hỏi có ý nghĩa đặc biệt trong biểu thức Regex. Vì vậy, chúng ta cần escape nó. Sử dụng prefix backslash trước ký tự đặc biệt: \?. Điều này cho phép sử dụng một ký tự đặc biệt như một ký tự thông thường:

Để sử dụng ký tự đặc biệt trong biểu thức Regex, cần escape nó bằng cách sử dụng một backslash (\)

Flags

Một biểu thức Regex thường xuất hiện trong một biểu mẫu , trong đó biểu mẫu được phân định bằng forward slashes (/.../). Để chỉ định một flag bạn thêm nó ngay sau ký tự gạch chéo cuối cùng.

Có nhiều flag khác nhau, chúng ta sẽ tìm hiểu về các flag thường được sử dụng: Global, Case insensitive, Multi-line. Chúng ta có thể kết hợp các flag.

Global flag

Global flag sẽ lấy tất cả các giá trị thỏa mãn biểu thức Regex thay vì chỉ lấy giá trị đầu tiên tìm thấy: /e/g

Case insensitive

Việc tìm kiếm không phân biệt chữ hoa, thường: /e/i

Như đã nói ở trên, chúng ta có thể kết hợp các flag với nhau: /e/gi

Multi-line

Khi bạn muốn tìm kiếm một text trên nhiều dòng, sử dụng multi-line flag: /are/m

g: global - Lấy tất cả các giá trị tìm thấy

i: Case insensitive - Tìm kiếm không phân biệt hoa thường

m: multi-line - Tìm kiếm trên nhiều dòng

Character classes (Lớp ký tự)

Một character class là một ký hiệu đặc biệt phù hợp với bất kỳ biểu tượng từ một bộ nhất định. Giả sử chúng ta có một số điện thoại, +(903)123-4567, và chúng ta muốn nó chỉ chứa các chữ số.

Để làm điều đó, chúng ta phải loại bỏ bất cứ thứ gì không phải là số. Và đó là một thứ gì đó mà character class có thể giải quyết. \d character class khớp với bất kỳ chữ số nào, là một ký tự từ 0-9. Điều này hoàn hảo cho trường hợp sử dụng của chúng ta:

Ngoài \d chúng ta còn có các character class khác.

\w sẽ khớp với một ký tự là chữ, số hoặc dấu gạch dưới.

\s khớp với một space symbol - bao gồm spaces, tabs và newlines.

Mặc dù có nhiều character classes, nhưng \d, \w, \s thường được sử dụng nhất.

Ngịch đảo của các Character class trên

Mỗi character class có một nghịch đảo được biểu thị bằng cũng một chữ cái, nhưng được viết hoa. Ví dụ nghịch đảo của \d\D.

\w - Là một ký tự, số, dấu gạch dưới

\d - Là ký tự số

\s - whitespace

Inverse

\W - Không phải là một ký tự, số, dấu gạch dưới

\D - Không phải là ký tự số

\S - non whitespace

Quantifiers (Bộ định lượng)

Một chủ đề cuối cùng mà chúng ta sẽ thảo luận trong bài viết này là quantifiers. Một regex quantifier chỉ định tần suất một biểu thức regex.

Có một vài bộ định lượng khác nhau. Chúng ta sẽ lần lượi tìm hiểu.

Zero or one (?)

Quantifier đầu tiên là ? - có nghĩa là 0 hoặc 1. Trong ví dụ sau, chúng ta sử dụng biểu thức regex /ba?/g. Biểu thức sẽ kiểm tra cho bất kỳ ký tự b nào theo sau là 0 hoặc 1 ký tự a.

Zero or more (*)

Quantifier thứ 2 là * - nghĩa là 0 hoặc nhiều.

One or more (+)

Cũng có bộ định lượng 1 hoặc nhiều, được biểu diễn bởi +.

Chúng ta cũng có thể chỉ định một số lượng xuất hiện cụ thể phải phù hợp với bộ định lượng. Ví dụ, biểu thức regex /ba{2}/g sẽ khớp với bất kỳ ký tự b nào theo sau là 2 ký tự a liên tiếp.

Nếu bạn muốn giới hạn một khoảng ký tự liên tiếp, bạn có thể set số thứ hai, phân tách nhau bởi dấu phẩy. Biểu thức regex /ba{2, 4}/ sẽ khớp với bất kỳ ký tự b nào theo sau là 2 đến 4 ký tự a.

Chúng ta có thể làm điều tương tự cho bất kỳ ký tự b nào được theo sau bởi ít nhất 2 ký tự a. Biểu thức regex sẽ như sau: /ba{2,}/g.

a? - Khớp với một ký tự a hoặc không.

a - Khớp với không hoặc nhiều ký tự a liên tiếp.

a+ - Khớp với một hoặc nhiều ký tự a liên tiếp.

a{2} - Khớp chính xác 2 ký tự a liên tiếp.

a{2, 4} - Khớp giữa 2 và 4 ký tự a liên tiếp.

a{2,} - Khớp với ít nhất 2 ký tự a liên tiếp.

Summary

Chúng ta vừa đi qua những kiến thức cơ bản về các biểu thức Regex, đã đến lúc bạn nên thực hành nó. Và tất nhiên, có nhiều thứ để học khi nói đến biểu thức regex. Nhưng thật sáng suốt khi chúng ta nắm vững những kiến thức cơ bản trước khi học những phần nâng cao hơn.

Cảm ơn các bạn đã đọc.

Tham khảo: https://levelup.gitconnected.com/read-this-if-you-dont-know-enough-about-regex-73141bb0e1a7