Học Sử Dụng Biểu Thức Chính Quy

Biểu thức chính quy (Regular Expression) là một công cụ mạnh mẽ để xử lý chuỗi ký tự, giúp giảm đáng kể số lượng mã so sánh và tìm kiếm.

Cấu Trúc

  • Mô Tả Đặc Đặc:
    • \: Ký hiệu thoát, chuyển đổi ký hiệu đặc biệt thành ký hiệu thông thường và ngược lại.
    • .: Đại diện cho bất kỳ ký tự nào trừ \n.
    • ^: Bắt đầu bằng ký hiệu.
    • $: Kết thúc bằng ký hiệu.
    • \n: Ký hiệu xuống dòng.
    • \d: Số từ 0 đến 9.
    • \D: Bất kỳ ký hiệu nào không phải số từ 0 đến 9.
    • \w: Số, chữ cái hoặc dấu gạch dưới.
    • \W: Bất kỳ ký hiệu nào không phải số, chữ cái hoặc dấu gạch dưới.
    • \s: Ký hiệu khoảng trắng (khoảng trắng, tab, xuống trang).
    • \t: Ký hiệu tab (4 khoảng trắng).
    • \b: Giới hạn từ.
    • x | y: Hoặc.
    • [xyz]: Đại diện cho x, y hoặc z.
    • [^xy]: Đại diện cho bất kỳ ký hiệu nào không phải x hoặc y.
    • [a-z]: Đại diện cho tất cả các chữ cái từ a đến z.
    • (...): Nhóm trong biểu thức chính quy.
    • (?:...): Chỉ khớp mà không bắt.
    • (?=...): Khớp trước.
    • (?!...): Không khớp trước.
  • Mô Tả Lặp:
    • *: Lặp 0 hoặc nhiều lần.
    • +: Lặp 1 hoặc nhiều lần.
    • ?: Lặp 0 hoặc 1 lần.
    • {n}: Lặp đúng n lần.
    • {n,m}: Lặp từ n đến m lần.
  • Mô Tả Thường:
    • /abc/: Khớp chuỗi "abc".
  • Trình So Sánh:
    • i: Bỏ qua chữ hoa chữ thường.
    • m: Khớp nhiều dòng.
    • g: Khớp toàn cầu.

Tính Ngộ Lôi

let str = 'ab2020nb';
let reg = /\d+?/g;
console.log(str.match(reg));

Thêm ? sau các mô tả lặp để hủy bỏ tính ngộ lôi, khớp với kết quả ngắn nhất.

Tính Nhẹ Nhàng

let str = 'nb13奥利给6666aaaa';
let reg = /\d+/g;

Khi sử dụng exec, mỗi lần chỉ khớp với một kết quả phù hợp đầu tiên. Sử dụng trình so sánh toàn cầu g để thay đổi hành vi này.

Ví Dụ Một Số Biểu Thức Chính Quy Đơn Giản

  • Kiểm Tra Số Điện Thoại:
    let tel = /^1\d{10}$/;
    
  • Kiểm Tra Giá Trị Số Học:
    let num = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
    
  • Kiểm Tra Tên Thật:
    let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/;
    
  • Kiểm Tra Địa Chỉ Email:
    let email = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
    
  • Kiểm Tra Chứng Minh Nhân Dân:
    let id = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/;
    

Ghi Chú Học Trước Đó

let time = '2020-11-6';
let reg = /^(\d{4})-(\d{1,2})-(\d{1,2})/;
let time2 = time.replace(reg, '$1 năm $2 tháng $3 ngày');

Sử dụng replace để định dạng chuỗi thời gian.

Ký Tự Xuất Hiện Nhiều Nhất

function countMaxChar(str) {
    let obj = {}, max = 0, res = [];
    for (let char of str) {
        obj[char] = (obj[char] || 0) + 1;
        if (obj[char] > max) {
            max = obj[char];
        }
    }
    for (let key in obj) {
        if (obj[key] === max) {
            res.push(key);
        }
    }
    return `Ký tự xuất hiện nhiều nhất: ${res}\nSố lần xuất hiện: ${max}`;
}

Định Dạng Chuỗi Thời Gian

function formatDateTime(template = "{0} năm {1} tháng {2} ngày {3} giờ {4} phút {5} giây") {
    let parts = this.match(/\d+/g);
    return template.replace(/\{(\d+)\}/g, (match, index) => {
        let part = parts[index] || '00';
        return part.padStart(2, '0');
    });
}
String.prototype.formatDateTime = formatDateTime;
let time = '2020-11-17 09:0:00';
console.log(time.formatDateTime());

Tách URL

function parseUrlParams(url) {
    let params = {};
    url.replace(/([^?=&#]+)=([^?=&#]+)/g, (match, key, value) => params[key] = value);
    url.replace(/#([^$=?]+)/, (match, hash) => params.hash = hash);
    return params;
}
console.log(parseUrlParams('www.example.com?param1=value1¶m2=value2#section'));

Chèn Dấu Phẩy

function addCommas(number) {
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
console.log(addCommas(1234567890));

Thẻ: regex JavaScript string-manipulation pattern-matching

Đăng vào ngày 19 tháng 7 lúc 15:25