Tìm hiểu về Regular Expression
This post hasn't been updated for 6 years
Regular Expression là gì?
Biểu thức chính quy (tiếng Anh: regular expression, viết tắt là regexp, regex hay regxp) là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định. Đơn giản thì nếu bạn cần validate các trường nhập vào ô input bạn có thể dùng regex, bạn muốn tìm kiếm một chuỗi với các điều kiện tùy chỉnh bạn có thể dùng regex,....
Học cách sử dụng Regular Expression?
Mình thường sử dụng trang regex101.com để học, và test các đoạn regex, ngoài ra còn một số trang khác như:
Bạn có thể chọn 1 trang phù hợp để thực hành.
Các quy tắc cơ bản
Quy tắc | Mô tả | Ví dụ |
---|---|---|
[abc] | Tìm và so sánh tất cả các ký tự trong dấu ngoặc vuông và trùng với 1 trong các ký tự trong dấu ngoặc | viblo => viblo |
[a-z] | Tìm và so sánh theo khoảng giá trị, a-z sẽ trùng với các ký tự từ a đến z hoặc [A-C] sẽ trùng với các ký tự hoa từ A đến C tương tự với [0-9] | viblo => viblo |
[^abc] | So sánh không trùng khớp, dấu ^ giống như dấu phủ định vậy | viblo => viblo |
^v | Trùng khớp với phần đầu của chuỗi | viblo => viblo |
o$ | Trùng khớp với phần cuối của chuỗi | viblo => viblo |
* | Cho phép kí tự trước nó lặp lại 0 lần hoặc nhiều lần | viblooooo* => viblooooo |
+ | Cho phép kí tự trước nó lặp lại 1 lần hoặc nhiều lần | o+ => vibloooo |
? | Cho phép kí tự trước nó lặp lại 0 lần hoặc 1 lần duy nhất | o? => viblo |
Ngoài ra còn nhiều quy tắc khác bạn có thể tham khảo ở đây https://developer.mozilla.org/vi/docs/Web/JavaScript/Guide/Regular_Expressions
Ví dụ thực hành
Validate email
Đầu tiên thì mình có một số yêu cầu đối với một email hợp lệ là:
- Địa chỉ email phải bắt đầu bằng 1 ký tự
- Địa chỉ email là tập hợp của các ký tự a-z, 0-9 và có thể có các ký tự như dấu chấm, dấu gạch dưới
- Độ dài tối thiểu của email là 5, độ dài tối đa là 32
- Tên miền của email có thể là tên miền cấp 1 hoặc tên miền cấp 2
Từ các yêu cầu trên ta có thể đi viết mã regex để so khớp:
- Địa chỉ email phải bắt đầu bằng 1 ký tự
^[a-z]
- Địa chỉ email là tập hợp của các ký tự a-z, 0-9 và có thể có các ký tự như dấu chấm, dấu gạch dưới
^[a-z][a-z0-9\.\_]
- Độ dài tối thiểu của email là 5, độ dài tối đa là 32
^[a-z][a-z0-9\.\_]{5,32}
- Tên miền của email có thể là tên miền cấp 1 hoặc tên miền cấp 2
^[a-z][a-z0-9_\.]{5,32}@[a-z0-9]{2,}(\.[a-z0-9]{2,4}){1,2}$
Bạn có thể xem demo ở đây https://regex101.com/r/MVUhMV/1
Lấy link ảnh khi crawl dữ liệu
Mình có một đoạn text sau để test:
<img src="http://abc.png">
<img src='http://abc.png'>
<img src='https://abc.png'>
<img src='http://abc.png'/>
<img src='http://abc.jpg'>
<img class="abc" src='http://abc.jpeg'>
Mục tiêu của mình chỉ là lấy tất cả ký tự bên sau src= và mình có mã regex sau:
<img.*src='?"?(.*?)'?"?\/?>
Nhìn nó hơi cùi ^^. Bạn có thể xem demo ở đây https://regex101.com/r/A0yt4i/1/
Kết luận
Ứng dụng của Regular Expression có rất nhiều và việc tìm hiểu nó sẽ giúp bạn dễ dàng hơn rất nhiều khi cần xử lý chuỗi, bạn có thể tự đặt ra các yêu cầu để thực hành và làm chủ được Regular Expression tốt hơn, chúc bạn học tập làm việc thật tốt ^^
All Rights Reserved