Biểu thức chính quy là nỗi sợ hãi của nhiều lập trình viên. Những cái gì khó nhớ, ít làm, lập trình viên sẽ Google, Stack Overflow cho nhanh. Chạy được là ok còn không cần hiểu và nhớ kỹ làm gì cho mệt. Dần dần, ai cũng dùng Biểu thức chính quy nhưng chả có mấy ai hiểu quy tắc viết Biểu thức chính quy. Trong bài viết này tôi chia sẻ nhiều quy tắc để hiểu và ghi nhớ Biểu thức chính quy
1. Biểu thức chính quy là gì?
Biểu thức chính quy là kỹ thuật viết biểu thức để tìm chuỗi tìm kiếm trùng lặp theo yêu cầu. Regular = thông thường, Expression = biểu thức. Chúng ta tạm gọi nó là biểu thức thông thường hoặc vài nơi gọi là biểu thức chính quy. Còn lại tôi gọi đơn giản 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 tra cứu. email, số điện thoại
- Tìm các 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, cái mới là sức mạnh của regex
Để học hiệu quả Regex nhanh, hãy thực hiện tôi xin giới thiệu một số nguồn
- Regex tuyệt vời. liên kết các nguồn, tài liệu học regex
- Regex101. công cụ trực tuyến để viết và thử regex
- Học Regex thật đơn giản
- Bảng tính Regex
- Top 15 Regex thường được sử dụng
Một biểu thức regex đầy đủ sẽ bao gồm hai phần
- Phần biểu thức [biểu thức]. chúng ta cần phải viết
- Cờ phần điều khiển cách tìm chuỗi tìm kiếm phù hợp [flags]. chỉ cần chọn cho phù hợp
2. Giải thích
2. 0 Flags - control flags
Please try this example
/^Chào thế giới/gmui
https. //regex101. com/r/8ZC0sc/1
Giải thích
- g. toàn cầu
- m. đa tuyến
- u. unicode
- i. trường hợp không nhạy cảm
2. 1 Matching Symbol - biểu tượng để khớp
Biểu thứcGiải thích. Khớp với mọi ký tự^helloKhớp chuỗi ở đầu dònghello$Khớp chuỗi ở cuối dòngXYX tiếp theo đó phải Y[abc]Khớp 1 ký tự hoặc a hoặc b hoặc c. /\bcountr[y|ies]\b/gmi
1 định nghĩa một dải các lựa chọn[abc][xy]Ký tự đầu hoặc a hoặc b hoặc c, nối tiếp theo là ký tự x hoặc y\bhello\bDanh giới của bên trái và bên phải. Matchmatch must be a from chứ không phải là string con[^abc]/\bcountr[y|ies]\b/gmi
2 overlay strip next by. Là bất kỳ ký tự nào không phải là a hoặc b hoặc [màu. color]Hoặc /\bcountr[y|ies]\b/gmi
3 hoặc /\bcountr[y|ies]\b/gmi
4. /\bcountr[y|ies]\b/gmi
5 group of characters to a blockcount[y. tức là]Hoặc /\bcountr[y|ies]\b/gmi
6 hoặc /\bcountr[y|ies]\b/gmi
72. 2 Meta character - Ký tự đại diện
Các ký tự Giải thích\ Bất kỳ chữ số nào [0-9]\DKý tự không phải chữ số [^0-9]\sKý tự cách khoảng trắng\wKý tự [a-zA-Z_0-9]\WKý tự khác 2. 3 Quantifier - đếm số lần khớp
Biểu tượngGiải thích*Xuất hiện 0 đến nhiều lần. Tương đương {0,}+Xuất hiện 1 đến nhiều lần. Tương đương {1,}?Xuất hiện 0 hoặc 1 lần. Tương đương {0,1}{X}Xuất hiện X lần{X,Y}Xuất hiện từ X đến Y lần2. 4 Dải /\bcountr[y|ies]\b/gmi
1 và Nhóm /\bcountr[y|ies]\b/gmi
5
Phạm vi
/\bcountr[y|ies]\b/gmi
1 tạo ra một dải lựa chọn. Ví dụ/\bcountr[y|ies]\b/gmi
11. hoặc /\bcountr[y|ies]\b/gmi
12 hoặc /\bcountr[y|ies]\b/gmi
13
/\bcountr[y|ies]\b/gmi
14 một ký tự bất kỳ nằm trong dải /\bcountr[y|ies]\b/gmi
15 đến /\bcountr[y|ies]\b/gmi
16
/\bcountr[y|ies]\b/gmi
17 cũng không khác gì so với /\bcountr[y|ies]\b/gmi
18. Việc bổ sung các ký tự HOẶC /\bcountr[y|ies]\b/gmi
19 trong /\bcountr[y|ies]\b/gmi
1 không có tác dụng gì
Nhóm
/\bcountr[y|ies]\b/gmi
5 nhóm các ký tự bên trong thành một khối/\bcountr[y|ies]\b/gmi
22. group ký tự tạo thành phần mở rộng tệp. Sử dụng thêm /\bcountr[y|ies]\b/gmi
19 để tạo ra các lựa chọn kết nối bằng OR
/\bcountr[y|ies]\b/gmi
5 may be contain /\bcountr[y|ies]\b/gmi
1 and many character, biểu tượng bên trong
3. Thực hiện theo tình huống
Vui lòng sử dụng Regex101 để viết regex và xem kỹ giải thích. Ở đây tôi dùng từ
/\bcountr[y|ies]\b/gmi
26 có nghĩa là /\bcountr[y|ies]\b/gmi
27. /\bcountr[y|ies]\b/gmi
28 có nghĩa là /\bcountr[y|ies]\b/gmi
29Trong các biểu thức regex dưới đây, phần cuối cùng của
/\bcountr[y|ies]\b/gmi
00 chính là điều khiển cờ3. 1 Canmatch any string contains /\bcountr[y|ies]\b/gmi
6 or /\bcountr[y|ies]\b/gmi
7
/\bcountr[y|ies]\b/gmi
https. //regex101. com/r/iKoIaX/1
Giải thích
/\bcountr[y|ies]\b/gmi
03 start the expression
- Điều khiển cờ
/\bcountr[y|ies]\b/gmi
00. g [tìm kiếm toàn cầu] tìm tất cả các chuỗi phù hợp, m [multilines] tìm trên nhiều dòng, i [không phân biệt chữ hoa chữ thường] không quan tâm chữ hoa chứ thường
/\bcountr[y|ies]\b/gmi
05. match character /\bcountr[y|ies]\b/gmi
06 or string /\bcountr[y|ies]\b/gmi
07
3. 2 Số di động ở Việt nam bao gồm 10 đến 11 chữ số
Request
- Có từ 10-11 chữ số
- must have the number 0 first
/\bcountr[y|ies]\b/gmi
1https. //regex101. com/r/YjmkFm/1
Giải thích
/\bcountr[y|ies]\b/gmi
08. ranh giới từ yêu cầu chuỗi khớp phải là một từ đầy đủ chứ không phải chuỗi con. Chúng ta phải chặn hai đầu chuỗi di động bằng /\bcountr[y|ies]\b/gmi
08
/\bcountr[y|ies]\b/gmi
20. first number must be number 0
/\bcountr[y|ies]\b/gmi
21. một ký tự nằm trong danh sách từ /\bcountr[y|ies]\b/gmi
20 đến /\bcountr[y|ies]\b/gmi
23
/\bcountr[y|ies]\b/gmi
24. number of numbers from 9 to 10 characters
3. 3 Kiểm tra email có hợp lệ không
/\bcountr[y|ies]\b/gmi
2Đây là regex tôi lấy nguyên từ Stack Overflow mà không chút nghĩ ngợi. Link running try here https. //regex101. com/r/rtuOuV/1
3. 4 hà nội, hà lội, hà nội
Cần tìm tất cả các từ hà nội, hà lội, hà nội, hà nội, hà nội
/\bcountr[y|ies]\b/gmi
0https. //regex101. com/r/WRIeeX/1
Giải thích
- Luôn phải chặn hai đầu biểu thức bằng
/\bcountr[y|ies]\b/gmi
08 để yêu cầu chuỗi đối sánh phải là một từ đầy đủ chứ không phải chuỗi con
- Sử dụng phạm vi
/\bcountr[y|ies]\b/gmi
26, /\bcountr[y|ies]\b/gmi
27 để chấp nhận các ký tự có dấu và không dấu
- Sử dụng phạm vi
/\bcountr[y|ies]\b/gmi
11 để chấp nhận khi có người nói nhầm lẫn giữa /\bcountr[y|ies]\b/gmi
12 với /\bcountr[y|ies]\b/gmi
13
3. 5 Tên. xxx,Họ. yyyy
Tomatch string has format FirstName.
/\bcountr[y|ies]\b/gmi
51,Họ. /\bcountr[y|ies]\b/gmi
52. Giữa FirstName. and /\bcountr[y|ies]\b/gmi
51 has 0 or many white distanceGiữa Họ. and
/\bcountr[y|ies]\b/gmi
52 has 0 or many white distance/\bcountr[y|ies]\b/gmi
2https. //regex101. com/r/arUAJw/1
Giải thích
/\bcountr[y|ies]\b/gmi
08. start a word
/\bcountr[y|ies]\b/gmi
56. có 0 hoặc nhiều khoảng trắng
/\bcountr[y|ies]\b/gmi
57. character group [a-zA-Z_0-9]
3. 6 Tên tệp ảnh
Cần tìm ra tất cả các tên tệp ảnh có đuôi png, jpeg, jpg, gif
/\bcountr[y|ies]\b/gmi
5https. //regex101. com/r/XRyE7d/2/
Giải thích
________ 558 buộc chuỗi cần tìm kiếm phải có phần mở rộng bao gồm hoặc
/\bcountr[y|ies]\b/gmi
59 hoặc /\bcountr[y|ies]\b/gmi
60 hoặc /\bcountr[y|ies]\b/gmi
61 hoặc /\bcountr[y|ies]\b/gmi
62
3. 7 Địa chỉ IPv4 aaa. bbb. ccc. đđ
Địa chỉ IPv4 bao gồm 4 khối cách nhau bằng 3 dấu
/\bcountr[y|ies]\b/gmi
63 ví dụ. 192. 168. 1. 1, hay 127. 0. 0. 1/\bcountr[y|ies]\b/gmi
6https. //regex101. com/r/hjKDOX/1
Sắp xếp khác hơn, mỗi khối không vượt quá 255
/\bcountr[y|ies]\b/gmi
1https. //regex101. com/r/ypHIfa/1
3. 8 địa chỉ http. // hoặc https. //
/\bcountr[y|ies]\b/gmi
2https. //regex101. com/r/N3R9M0/1/
3. 9 Chuỗi năm-tháng-ngày
/\bcountr[y|ies]\b/gmi
0https. //regex101. com/r/FbqI8q/1
Giải thích
/\bcountr[y|ies]\b/gmi
64. Ký tự đầu tiên của năm phải là /\bcountr[y|ies]\b/gmi
65 hoặc /\bcountr[y|ies]\b/gmi
66. Còn lâu mới đến năm 3xxx
/\bcountr[y|ies]\b/gmi
67. Tiếp theo đó là 3 chữ số còn lại của năm
/\bcountr[y|ies]\b/gmi
68. nhóm chữ số có thể xuất hiện trong tháng có 2 khả năng- dưới 10.
/\bcountr[y|ies]\b/gmi
69. 01,02,. ,09
- trên 10.
/\bcountr[y|ies]\b/gmi
10. 11, 12
/\bcountr[y|ies]\b/gmi
11. the group number may ngày có 3 khả năng- dưới 10.
/\bcountr[y|ies]\b/gmi
69
- 11 đến 29.
/\bcountr[y|ies]\b/gmi
13
- 30 và 31.
/\bcountr[y|ies]\b/gmi
14
Kết luận
Biểu thức thông thường - Regex giúp bạn xử lý chuỗi, tìm kiếm, kiểm tra hợp lệ một cách nhanh chóng, dễ dàng. Một ngôn ngữ lập trình ngôn ngữ có thể không hỗ trợ Class [Go], không hỗ trợ Generic [Go], không hỗ trợ Reflection [C++], không hỗ trợ kiểu rô bốt [Kiểu vịt] nhưng nếu không hỗ trợ Regex thì nó không hỗ trợ . By handle number and string is hai thao tác tối thiểu cần thiết trong mọi ngôn ngữ lập trình
Regex không khó hiểu. Bạn có thể quên regex nhưng một khi đã hiểu và xem lại Cheat sheet, cùng với nguyên mẫu công cụ biểu thức https. //regex101. com/ bạn có thể tạo regex trong 15 phút
Cần phải nhớ rằng, biểu thức regex không thể đảm bảo mọi trường hợp. Ví dụ trường hợp
/\bcountr[y|ies]\b/gmi
15, Regex sẽ chấp nhận chuỗi /\bcountr[y|ies]\b/gmi
16. Thực tế không thể có ngày 31 trong tháng 2, nhưng trong Regex chúng ta không thể viết logic để xử lý trường hợp này. Tỷ lệ khớp [matching] càng chính xác thì biểu thức regex càng dài, càng phức tạp, càng khó gỡ lỗi và tốn thời gian khi chạy. Do đó, bạn cần kết hợp viết thành 2 cấp độ. lần đầu tiên sử dụng regex, lần thứ hai sử dụng logic mã để xử lý các ngoại lệ rất phức tạpLập trình Regex thật là đơn giản phải không các bạn. Hãy chịu khó vào blog Techmaster để xem và đóng góp bài viết nhé