---
# System prepended metadata

title: Regular Expression (Regex)
tags: [' Roles', Productivity, ' Tutorial']

---

---
slideOptions:
  transition: slide
  theme: night
tags: Productivity, Roles, Tutorial
type: 
title: Regular Expression (Regex)
---
<style>
    .reveal section img {
        background: transparent!important;
        border: none!important;
        box-shadow: none!important;
    }
</style>

# Regular Expression là gì?
- Regular Expression là kỹ thuật viết biểu thức để tìm kiếm chuỗi trùng hợp theo yêu cầu. Regular = thường xuyên, Expression = biểu thức. Chúng ta tạm gọi nó là biểu thức thường xuyên hoặc vài nơi gọi là biểu thức chính quy. Còn tôi đơn giản gọi là regex. Mọi ngôn ngữ lập trình đều hỗ trợ regex. Ứng dụng của regex:
    * Kiểm tra tính hợp lệ dữ liệu: email, số điện thoại...
    * Tìm những chuỗi phù hợp trong một chuỗi lớn theo biểu thức. Thay vì so sánh từng ký tự mà sử dụng biểu thức, đó mới là sức mạnh của regex
    - Để học nhanh Regex hiệu quả, thực dụng tôi xin giới thiệu một số nguồn (<b>recomment to read</b>):
    * [Regex Awesome](https://github.com/aloisdg/awesome-regex) : link các nguồn, tài liệu học regex
    * [Regex101](https://regex101.com/): Công cụ trực tuyến để viết và thử regex
    * [Học Regex thật đơn giản](https://github.com/ziishaned/learn-regex/blob/master/translations/README-vn.md)
    * [Cheatsheet Regex](https://cheatography.com/davechild/cheat-sheets/regular-expressions/)
    * [Top 15 Commonly Used Regex](https://digitalfortress.tech/js/top-15-commonly-used-regex/)

- Một biểu thức regex đầy đủ sẽ gồm hai phần:
    * Phần biểu thức (expression): chúng ta cần phải viết
    * Phần cờ điều khiển cách tìm kiếm chuỗi phù hợp (flags): chỉ cần chọn cho phù hợp

----

# Explaination (Giải thích):

## Flags (Cờ):
* Ví dụ: ```/^hello world/gmui```
* Giải thích:
* <b>g</b>: <i>Global</i>
* <b>m</b>: <i>Multiline</i>
* <b>u</b>: <i>Unicode</i>
* <b>i</b>: <i>Case insensitive</i>

----

## Matching symbol (Biểu tượng so khớp):

|Biểu tượng|Giải thích|Ví dụ|
|:--------:|:---------|:----|
|.|So khớp mọi ký tự|.hello|
|^|So khớp ký tự đầu dòng|^hello: Ký tự đầu tiên phải là <b>h</b>|
|$|Khớp ký tự ở cuối dùng|hello$|
|XY|Tiếp sau X phải là Y| |
|[]|Định nghĩa một dải các ký tự lựa chọn|[abc]: Khớp một ký tự <b>a</b> hoặc <b>b</b> hoặc <b>c</b>|
|[][]|Định nghĩa một chuỗi gồm 2 dải ký tự|[abc][xy]: Ký tự đầu tiên có thể là <b>a</b>, <b>b</b> hoặc <b>c</b>, ký tự tiếp theo có thể là <b>x</b> hoặc <b>y</b>|
|\b\b|Ranh giới trái phải, chuỗi khớp phải là một từ chứ không phải chuỗi con|\bhello\b|
|[^bac]|Phủ định của một dải chuỗi|[^abc]: Là bất kỳ ký tự nào không phải là <b>a</b>, <b>b</b> hoặc <b>c</b>|
|()|Nhóm các ký tự thành một khối (block)|countr(ies): countries|

----

## Meta character (Ký tự đại diện):
|Ký tự|Giải thích|Cách viết khác|
|:---:|:---------|:-------------|
|\D|Bất kỳ chữ số nào|[0-9]|
|\d|Ký tự phải là chữ|[^0-9], [a-zA-Z]|
|\s|Ký tự white space||
|\w|Ký tự có thể là chữ hoặc số|[a-zA-Z_0-9]|
|\W|Ký tự đặc biệt|[^a-zA-Z_0-9]|

----

## Quantifier (Đếm số lần khớp):
|Ký tự|Giải thích|Cách viết khác|
|:---:|:---------|:-------------|
| * |Xuất hiện không đến nhiều lần|{0,}|
| + |Xuất hiện một đến nhiều lần|{1,}|
| ? |Xuất hiện không hoặc 1 lần|{0,1}|
| {X} |Xuất hiện x lần|
| {x,y} |Xuất hiện từ x đến y lần||

----

## Range [] and Group ():
* Range [] tạo ra một dải các lựa chọn. 
<u>Ví dụ:</u>
    * ```[nl]```: hoặc n hoặc l
    * ```[a-z]```: một ký tự bất kỳ nằm trong dải a đến z
    * ```[a-z|A-Z]```: cũng không khác gì so với [a-zA-Z]. Việc thêm ký tự OR | trong [] không có tác dụng gì
* Group () nhóm các ký tự bên trong thành một khối.
<u>Ví dụ:</u>
    * ```(png|jpeg|gif|jpg)```: nhóm ký tự tạo thành file extension. Dùng thêm | để tạo ra các lựa chọn nối bằng OR
    * () có thể chứa [] và nhiều ký tự, biểu tượng bên trong.

----

## Sample (ví dụ):
* Số di động ở Việt Nam: 
    * Yêu cầu: Có từ 10-11 chữ số và phải có chữ số 0 đầu tiên
==> ```(\W{1}[0-9]{2})?(0[0-9]{9,10})```: +840903336666 hoặc +84 0903336666 hoặc 0903336666 đều đúng





