Regular Expression là gì ? Tại sao nên học RegExr

Khi mới học lập trình, có bao giờ bạn cảm thấy mệt mỏi khi phải xử lý một chuỗi ký tự hoặc một đoạn văn bản hay chưa? Đôi khi bạn phải tốn thời gian viết các đoạn code dài ngoằng, lặp tới , lặp lui, if else các kiểu chỉ để kiểm tra một ô input có hợp lệ hay không 😕 Regular Expression sẽ là cứu cánh của bạn trong những trường hợp như thế này.

Bài viết này hãy cùng mình tìm hiểu xem Regular Expression là gì? Và tại sao chúng ta lại nên học Regular Expression nhé.

Let’s get started !

Regular Expression là gì

1. Case Study

Trước khi tìm hiểu về Regular Expression thì chúng ta hãy xét qua một tình huống nhỏ sau để hiểu tổng quan về RegExr nhé.

Giả sử chúng ta có một chuỗi ký tự là mật khẩu người dùng nhập vào. Chúng ta cần kiểm tra độ mạnh của mật khẩu này theo các tiêu chí sau:

  • Ít nhất 8 ký tự
  • Nhiều nhất 40 ký tự
  • Chứa ít nhất 1 chữ hoa
  • Chứa ít nhất 1 ký tự thường
  • Chứa ít nhất 1 ký tự là số
  • Chứa ít nhất 1 ký tự đặc biệt
// Khi không sử dụng Regular Expression
function isPasswordStrength(pw = '') {
  const len = pw.length;

  // Ít nhất 8 ký tự và dài nhất 40 ký tự
  if (len < 8 || len > 40) {
    return false;
  }

  const lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
  const uppercaseLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const numbers = '0123456789';
  const specialChars = '!&%/()=?^*+][#><;:,._-|@';

  const check = {
    lowercase: false,
    uppercase: false,
    numbers: false,
    specialChars: false,
  };

  for (let c of pw) {
    if (!check.lowercase && lowercaseLetters.indexOf(c) !== -1) {
      check.lowercase = true;
    }

    if (!check.uppercase && uppercaseLetters.indexOf(c) !== -1) {
      check.uppercase = true;
    }

    if (!check.numbers && numbers.indexOf(c) !== -1) {
      check.numbers = true;
    }

    if (!check.specialChars && specialChars.indexOf(c) !== -1) {
      check.specialChars = true;
    }
  }

  return (
    check.lowercase && check.uppercase && check.numbers && check.specialChars
  );
}
// Khi dùng Regular Expression
function isPasswordStrength(pw = '') {
  const regex =
    /^(?=.*[A-Z])(?=.*[!&%\/()=\?\^\*\+\]\[#><;:,\._-|@])(?=.*[0-9])(?=.*[a-z]).{8,40}$/;
  return regex.test(pw);
}

2. Regular Expression là gì ?

Biểu thức chính quy – Regular Expression (viết tắt: RegExr hoặc Regex, RegExp) là một chuỗi ký tự đặc biệt được định nghĩa để tạo nên các mẫu (pattern) dùng để phân tích cú pháp, sự trùng khớp, tìm kiếm và thay thế trong các chuỗi, đoạn ký tự.

RegExr được dùng trong hầu hết các ngôn ngữ lập trình hiện nay, nó là một công cụ vô cùng mạnh mẽ để phân tích, validate dữ liệu đầu vào. Bạn có thể thấy sự ngắn gọn của nó trong case study bên trên.

3. Ứng dụng của RegExr

  • Phân tích, tách các chuỗi ký tự theo các pattern được định nghĩa bởi RegExr.
  • Kiểm tra tính hợp lệ của dữ liệu.
  • Tìm kiếm, thay thế từ, cụm từ, đoạn văn từ đơn giản đến phức tạp trong văn bản.
  • Rút gọn các đoạn code, dễ bảo trì code. Có một định nghĩa, cấu trúc chung cho tất cả các ngôn ngữ.
  • Viết một lần, dùng nhiều lần, nhiều nơi.
  • Tuy nhiên, để hiểu được thì cần tí thời gian để tìm hiểu các cú pháp của nó.

4. Cú pháp cơ bản của RegExr

Bạn có thể truy cập vào trang RegExr.com để luyện tập, thử và lưu trữ các pattern của mình ở đó nhé.

RegExr.com

Cú pháp cơ bản

Ký tựÝ nghĩa
.tất cả các ký tự, ngoại trừ ký tự xuống dòng
\wký tự là là chữ a-z và A-Z (không bao gồm ký tự đặc biệt)
\dký tự là số
\ský tự khoảng trắng (space hoặc tab)
\W \D \Skhớp với ký tự không phải chữ, số, và khoảng trắng
\t \n \rtab, xuống dòng và ký tự CR
\Thoát khỏi ký tự đặc biệt. VD: \\ sẽ khớp \
[abc]bất kỳ ký tự nào trong ngoặc vuông. VD: [abc] sẽ khớp với a hoặc b hoặc c
[^abc]bất kỳ ký tự nào không nằm trong ngoặc vuông
[b-f]bất kỳ ký tự nào trong khoảng từ b đến f
(abc)Gom nhóm
^bắt đầu chuỗi bởi. VD: ^a khớp với chuỗi bắt đầu bởi ký tự a
$kết thúc chuỗi bởi. VD: hihi$ kết thúc chuỗi bởi hihi
\bkết thúc từ bởi … VD: hihi\b sẽ khớp với từ hellohihi
\Bkhông kết thúc từ bởi …
?0 hoặc 1. VD: /hi?/ khớp với hi hoặc h
*0 hoặc nhiều
+1 hoặc nhiều
{2}2 ký tự
{2,}Ít nhất 2 ký tự
{2, 4}Từ 2 tới 4 ký tự
|Hoặc. VD: ab|cd khớp với ab hoặc cd
Regular Expression Cheatsheet

Cú pháp nâng cao với Lookahead

Positive Lookahead (?=) hiểu đơn giản, nó như một câu điều kiện. Nó sẽ lọc ra những chuỗi thoả điều kiện bên trong lookahead (?=). Sau đó, lấy những chuỗi đó tiếp tục match với các điều kiện còn lại.

// RegExr tìm chuỗi chứa abc và ít nhất có 1 chữ in hoa
const regex = /(?=.*[A-Z].*)abc/g;
// Tìm những chuỗi thoả điều kiện .*[A-Z] (Các chuỗi bất kỳ kết thúc bởi 1 ký tự A-Z) ví như 1AhxnA, Av1abcjaZ
// Từ những chuỗi tìm được sẽ tiếp tục xem có khớp với abc không?

regex.test("axaxabcaA"); // true
regex.test("123abc"); // false do không có ký tự A-Z
regex.test("axaxabZ"); // false do không có abc

Negative Lookahead (?!) ngược lại với ?= ở trên, ?! sẽ tìm những chuỗi không thoả điều kiện bên trong lookahead, rồi sau đó mới tiếp tục match với đoạn phía sau.

RegExr Flags

Có 3 loại cờ hay sử dụng nhất trong Regular Expression:

  • g (global): Tìm kiếm trong toàn chuỗi.
  • i (case insensitive): Không phân biệt hoa thường.
  • m (multiline): hoạt động trên nhiều dòng.

RegExr trong JavaScript

Cách tạo một RegExr:

  • Cách 1: /<pattern>/flags
  • Cách 2: new RegExp(pattern, flags)
// Cách 1:
const regex = /^abc$/gi;

// Cách 2:
const regex2 = new RegExp('^abc$', 'gi');

Sử dụng RegExr:

Sử dụng Regular Expression
Nguồn: Viblo

Một vài Pattern hay sử dụng

  • Xác thực email: /[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igm
  • Độ mạnh mật khẩu: /^(?=.[A-Z].[A-Z])(?=.[!@#$&])(?=.[0-9].[0-9])(?=.[a-z].[a-z].*[a-z]).{8}$/
  • Dấu phân cách hàng ngàn: /\d{1,3}(?=(\d{3})+(?!\d))/g
  • Lấy tên miền từ URL: /https?:\/\/(?:[-\w]+.)?([-\w]+).\w+(?:.\w+)?\/?.*/i

Tham khảo thêm ở đây nhé:

Tạm kết

Mong rằng qua bài viết, bạn sẽ hiểu hơn về Regular Expression là gì? Nó được dùng để làm gì và tại sao nên học nó nhé. Trông nó có vẻ loằng ngoằng thế thôi nhưng khi đã nắm vững nó thì bạn sẽ tiết kiệm được rất nhiều thời gian và công sức đó. Khi đã đọc hiểu được một Regex rồi thì cần gì bạn cứ lên google search là có ngay pattern cần sử dụng hoặc có thể chỉnh sửa lại như ý muốn 😁

Cảm ơn mọi người đã đọc bài viết ❤

Bạn có thể tham khảo thêm:

Để lại một bình luận nhé