Blog

Regex là gì? Bạn có biết sự lợi hại của Regex?

Sử dụng regex để tìm kiếm các email có trong 1 văn bản

Regex là gì?

Regex (TA: Regular Expression) trong tiếng Việt được gọi là Biểu thức chính quy. Regex là các các kí tự được kết hợp với nhau theo quy tắc để tạo nên một trình tự giúp chúng ta tìm kiếm và thay thế văn bản một cách thông minh, nhanh chóng, đơn giản và thuận tiện. Regex có thể dùng được trong hầu hết các ngôn ngữ lập trình bậc cao như Java, C#, Python, JS, PHP,… Hiểu và sử dụng được regex, cuộc đời bạn sẽ nở hoa ?

Sử dụng regex để tìm kiếm các email có trong 1 văn bản
Sử dụng regex để tìm kiếm các email có trong 1 văn bản

Ứng dụng của Regular Expression

Nhìn ảnh gif ở đầu bài viết và hình ảnh demo sử dụng regex để tìm kiếm các email có trong 1 văn bản ngay phía trên, có lẽ bạn cũng đã hình dung ra một vài công dụng của regex rồi đúng không nào? Sau đây mình sẽ giúp bạn liệt kê một số vai trò không thể vắng bóng thằng cha regex này được:

Ứng dụng trong kiểm tra tính hợp lệ

  • Kiểm tra email có hợp lệ hay không, xem demo
  • Kiểm tra số điện thoại Việt Nam, xem demo
  • Kiểm tra URL hợp lệ
  • Kiểm tra độ dài của câu có nằm trong khoảng (a, b) hay không
  • Bất cứ cái gì có quy tắc, bạn đều có thể kiểm tra với regex nhé.

Ứng dụng trong tìm kiếm và thay thế

regex là gì
Ứng dụng của Regex trong tìm kiếm và thay thế văn bản – Demo trên Sublime Text 3 (Click vào mới thấy, ảnh gif đó)

Hãy quan sát ảnh trên, bạn sẽ thấy được sự thần kỳ của regex trong việc tìm kiếm và thay thế văn bản. Nếu bạn chỉ sử dụng tìm kiếm và thay thế giống trong Word, bạn sẽ chẳng bao giờ làm được điều đó.

Sau khi tinh thông regex, việc ứng dụng nó vào trong quá trình tìm kiếm và thay thế của bạn sẽ đơn giản và dễ dàng hơn rất nhiều.

Hãy thử hình dung với bài toán lấy tất cả SĐT khách hàng trong một file văn bản 20MB xem. Bạn sẽ sử dụng cách nào để lấy được đống sđt trong đó:

  1. Dùng regex với chưa đến 10 dòng code, file nhỏ mở text editer là xong chứ méo cần code.
  2. Dùng một đống for, if else để sàng lọc lên tới 100 dòng.

Cú pháp của biểu thức chính quy

So khớp cơ bản

ChuỗiGiải nghĩa
.Khớp với bất kỳ ký tự nào
\dKhớp với số bất kỳ từ 0 – 9
\DPhủ định của \d
\wKhớp với các chữ cái tiếng anh, chữ số và dấu _
\WPhủ định của \w
<dấu cách>Khớp với dấu cách(SPACE trên bàn phím)
\tKhớp với dấu tab
\nKhớp với new line(xuống hàng)
\sKhớp với dấu trắng bất kỳ(dấu cách, \t,\n)
\SPhủ định của \s

Kết hợp các chuỗi so khớp

Bạn có thể kết hợp các chuỗi so khớp lại với nhau bằng cách đưa chúng vào trong cặp ngoặc vuông. Ví dụ:

  • [abc] -> Khớp các ký tự hoặc là a, hoặc là b, hoặc là c
  • [a-fA-Z] -> a-f là tất cả các ký tự từ a đến f trong bảng chữ cái tiếng anh đó, A-Z tương tự là từ A hoa đến Z hoa. Vậy là regex này khớp với mọi ký tự trong bảng chữ cái tiếng anh bất kể hoa thường.
  • [\d,] -> Khớp với ký tự số hoặc dấu ,

Bạn có thể loại trừ các giá trị không mong muốn bằng cách như sau:

  • [^a-z] -> Khớp với mọi ký tự trừ các ký tự trong bảng chữ cái tiếng anh.
  • [^ueoai] -> Khớp với mọi ký tự trừ các nguyên âm trong tiếng anh.

Các ký tự ranh giới

Ký tựGiải nghĩa
\bXác định ranh giới của từ, xem demo
\BPhủ định của \b, xem demo
^Xác định vị trí bắt đầu của dòng, demo
$Xác định vị trí kết thúc của dòng, demo

Sử dụng hoặc trong regex

Đôi khi bạn muốn so khớp hoặc giá trị này, hoặc giá trị kia. Chẳng hạn số điện thoại ở Việt Nam có thể bắt đầu là 0, hoặc 84 hoặc +84 thì ta phải làm sao?

Khi đó ta dùng: (0|84|+84) -> Lưu ý dấu + là ký tự định lượng nên phải có dấu \ đằng trước, đọc tiếp đi rồi sẽ biết định lượng là cái gì ha. -> Xem demo ở đây

Chú ý: Nên dùng (?:0|84|+84) thay cho regex trên, trong trường hợp bạn không muốn sử dụng lại cụm giá trị đầu số này để thay thế. -> tối ưu tốc độ xử lý.

Các ký tự định lượng

Loại định lượngGiải nghĩaDemo
X*So khớp lặp lại regex X 0 hoặc vô số lầnDemo link
X+So khớp lặp lại regex X 1 hoặc vô số lầnDemo link
X?So khớp lặp lại regex X 0 hoặc 1 lầnDemo link
X{m}So khớp lặp lại regex X chính xác m lầnDemo link
X{m,}So khớp lặp lại regex X m hoặc nhiều hơn m lầnDemo link
X{m,n}So khớp lặp lại regex X với số lần từ m tới n (bao gồm cả m và n)Demo link

Và một số ví dụ sau đây:

  • ab+ sẽ khớp các chuỗi ab, abb, abbb…
  • (ab)+ sẽ khớp các chuỗi ab, abab, ababab…

Mặc định giá trị định lượng * và + sẽ tham lam tới mức tối đa, nhưng ta có thể ngăn nó ăn tham bằng định lượng ?:

  • Tham lam: ^.*b sẽ khớp aacbaabde (phần khớp là phần gạch chân đó). Nó sẽ khớp cho tới ký tự b cuối cùng của chuỗi luôn.
  • Lười nhác: .*?b sẽ chỉ khớp aacbaabde (gặp ký tự b đầu tiên là nó dừng lại).

Các ký tự đặc biệt của regex

Giống như ngôn ngữ lập trình có các từ khóa mà bạn không được phép khai báo trùng. Thì regex cũng vậy, nó có các ký tự đặc biệt đang nắm giữ các vai trò quan trọng. Bạn muốn dùng nó thì phải báo cho nó biết:

Cụ thể, các ký tự {}[]()^$.|*+?\ và dấu - ở trong cặp ngoặc vuông là các ký tự đặc biệt. Nếu bạn muốn dùng nó để so khớp thì cần thêm dấu \ vào đằng trước:

Ví dụ: \. sẽ khớp với dấu chấm (.) và \\ sẽ khớp với ký tự \.

Trên đây là các kiến thức cơ bản, nói cơ bản thôi chứ nhớ nhiêu đó là đủ sài rồi đấy. Nếu bạn muốn học nhiều hơn nữa, thực hành nhiều hơn nữa thì đọc tiếp bài viết nhé

Một số regex được sử dụng phổ biến

Dưới đây là danh sách các regex được sử dụng phổ biến. Đôi khi, có những các phức tạp nhưng phổ biến thì ta nên dùng các regex đã được cộng đồng mạng kiểm chứng có phải tốt không nào. Dưới đây tôi xin liệt kê ra các regex phổ biến, mỗi regex trên một dòng nhé.

Lưu ý: Cái bắt đầu ^ và $ bạn có thể thêm, bỏ nếu cần nhé.

So khớp email

  • ^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$
  • ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$
  • ^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
  • ^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$
  • ^.+@.+$

So khớp URL

  • ^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$
  • ((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
  • (http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?
  • ^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\’/\\\+&amp;%\$#\=~])*$

So khớp SĐT ở VN

  • \+?(0|84)\d{9}

So khớp số nguyên

So khớp mã HTML

So khớp tên riêng

  • (?:[A-Z]\p{L}+ ){1,3}[A-Z]\p{L}+ -> demo link

Một số liên kết hữu ích

  1. Test regex online: https://regex101.com/
  2. Regex cheetsheet: http://web.mit.edu/hackl/www/lab/turkshop/slides/regex-cheatsheet.pdf
  3. Thư viện regex: http://regexlib.com/

    Xin vui lòng điền vào form dưới đây. Chúng tôi sẽ liên hệ lại ngay cho bạn khi nhận được thông tin:


     
     
     

    Leave a Reply

    Your email address will not be published. Required fields are marked *