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

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

    regex-web.jpg

    Cú pháp cơ bản

    5f4cc3ee-e46a-4b9c-a81b-cfb35f8e3b9b-image.png

    66838271-d588-4c57-b01c-62a3b02e02d6-image.png

    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:

    use-regex.png

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

    Nguồn bài viết: https://dynonguyen.com/regular-expression-la-gi-tai-sao-nen-hoc-regexr/


Log in to reply
 

});