Đối sánh regex javascript

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

Đối sánh regex javascript

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à phải. Matching string 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 or
/\bcountr(y|ies)\b/gmi
4.
/\bcountr(y|ies)\b/gmi
5 group characters to a blockscount(y. tức là)Hoặc
/\bcountr(y|ies)\b/gmi
6 hoặc
/\bcountr(y|ies)\b/gmi
7

2. 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ần

2. 4 Phạm vi /\bcountr(y|ies)\b/gmi1 và Nhóm /\bcountr(y|ies)\b/gmi5

Phạm vi

/\bcountr(y|ies)\b/gmi
1 tạo ra một dải các lựa chọn. Ví dụ

  • /\b0[0-9]{9,10}\b/gmi
    1. hoặc
    /\b0[0-9]{9,10}\b/gmi
    2 hoặc
    /\b0[0-9]{9,10}\b/gmi
    3
  • /\b0[0-9]{9,10}\b/gmi
    4 một bất kỳ ký tự nào nằm trong dải
    /\b0[0-9]{9,10}\b/gmi
    5 đến
    /\b0[0-9]{9,10}\b/gmi
    6
  • /\b0[0-9]{9,10}\b/gmi
    7 cũng không khác gì so với
    /\b0[0-9]{9,10}\b/gmi
    8. Việc bổ sung các ký tự HOẶC
    /\b0[0-9]{9,10}\b/gmi
    9 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

  • (?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
    2. group ký tự tạo thành phần mở rộng tệp. Sử dụng thêm
    /\b0[0-9]{9,10}\b/gmi
    9 để tạo ra các lựa chọn kết nối bằng OR
  • /\bcountr(y|ies)\b/gmi
    5 có thể bao gồm
    /\bcountr(y|ies)\b/gmi
    1 và nhiều ký tự, 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ừ

(?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
6 có nghĩa là
(?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
7.
(?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
8 có nghĩa là
(?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
9

Trong các biểu thức regex dưới đây, phần cuối cùng

/\b(h[aà] [nl][oộô|]i)\b/gmi
0 chính là cờ điều khiển

3. 1 Canmatch any string contains /\bcountr(y|ies)\b/gmi6 or /\bcountr(y|ies)\b/gmi7

/\bcountr(y|ies)\b/gmi

https. //regex101. com/r/iKoIaX/1

Giải thích

  • /\b(h[aà] [nl][oộô|]i)\b/gmi
    3 start the expression
  • /\b(h[aà] [nl][oộô|]i)\b/gmi
    0 control flags. 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
  • /\b(h[aà] [nl][oộô|]i)\b/gmi
    5. match character
    /\b(h[aà] [nl][oộô|]i)\b/gmi
    6 or string
    /\b(h[aà] [nl][oộô|]i)\b/gmi
    7

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
/\b0[0-9]{9,10}\b/gmi

https. //regex101. com/r/YjmkFm/1

Giải thích

  • /\b(h[aà] [nl][oộô|]i)\b/gmi
    8. 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
    /\b(h[aà] [nl][oộô|]i)\b/gmi
    8

  • /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    0. first number must be number 0

  • /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    1. một ký tự nằm trong danh sách từ
    /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    0 đến
    /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    3

  • /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    4. number of numbers from 9 to 10 characters

3. 3 Kiểm tra email có hợp lệ không

(?:[a-z0-9!#$%&'*+\=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Đâ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

/\b(h[aà] [nl][oộô|]i)\b/gmi

https. //regex101. com/r/WRIeeX/1

Giải thích

  • Luôn phải chặn hai đầu biểu thức bằng
    /\b(h[aà] [nl][oộô|]i)\b/gmi
    8 để yêu cầu chuỗi khớp phải là một từ đầy đủ chứ không phải chuỗi con
  • Sử dụng phạm vi
    /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    6,
    /\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm
    7 để chấp nhận các ký tự có dấu và không dấu
  • Sử dụng phạm vi
    /\b0[0-9]{9,10}\b/gmi
    1 để chấp nhận khi có người nói nhầm lẫn giữa
    /\b0[0-9]{9,10}\b/gmi
    2 với
    /\b0[0-9]{9,10}\b/gmi
    3

3. 5 Tên. xxx,Họ. yyyy

Tomatch string has format FirstName.

/(\w+\.(png|jpeg|gif|jpg))/gm
1, Họ.
/(\w+\.(png|jpeg|gif|jpg))/gm
2. Giữa FirstName. and
/(\w+\.(png|jpeg|gif|jpg))/gm
1 has 0 or many white distance

Giữa Họ. và

/(\w+\.(png|jpeg|gif|jpg))/gm
2 có 0 hoặc nhiều khoảng trắng

/\bFirstName:[\s]*(\w+),[\s]*LastName:[\s]*(\w+)\b/gm

https. //regex101. com/r/arUAJw/1

Giải thích

  • /\b(h[aà] [nl][oộô|]i)\b/gmi
    8. start a word

  • /(\w+\.(png|jpeg|gif|jpg))/gm
    6. có 0 hoặc nhiều khoảng trắng

  • /(\w+\.(png|jpeg|gif|jpg))/gm
    7. 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

/(\w+\.(png|jpeg|gif|jpg))/gm

https. //regex101. com/r/XRyE7d/2/

Giải thích

  • /(\w+\.(png|jpeg|gif|jpg))/gm
    8 chuỗi buộc cần tìm kiếm phải có phần mở rộng bao gồm hoặc
    /(\w+\.(png|jpeg|gif|jpg))/gm
    9 hoặc
    /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    0 hoặc
    /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    1 hoặc
    /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    2

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

/\b(\d+).(\d+).(\d+).(\d+)\b/gm
3 ví dụ. 192. 168. 1. 1, hay 127. 0. 0. 1

/\b(\d+).(\d+).(\d+).(\d+)\b/gm

https. //regex101. com/r/hjKDOX/1

Sắp xếp khác hơn, mỗi khối không vượt quá 255

/\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm

https. //regex101. com/r/ypHIfa/1

3. 8 địa chỉ http. // hoặc https. //

/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#()?&\/=]*)/gm

https. //regex101. com/r/N3R9M0/1/

3. 9 Chuỗi năm-tháng-ngày

/\bcountr(y|ies)\b/gmi
0

https. //regex101. com/r/FbqI8q/1

Giải thích

  • /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    4. Ký tự đầu tiên của năm phải là
    /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    5 hoặc
    /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    6. Còn lâu mới đến năm 3xxx
  • /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    7. Tiếp theo đó là 3 chữ số còn lại của năm
  • /\b(\d+).(\d+).(\d+).(\d+)\b/gm
    8. nhóm chữ số có thể xuất hiện trong tháng có 2 khả năng
    • dưới 10.
      /\b(\d+).(\d+).(\d+).(\d+)\b/gm
      9. 01,02,. ,09
    • trên 10.
      /\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
      0. 11, 12
  • /\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
    1. the group number may ngày có 3 khả năng
    • dưới 10.
      /\b(\d+).(\d+).(\d+).(\d+)\b/gm
      9
    • 11 đến 29.
      /\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
      3
    • 30 và 31.
      /\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
      4

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

/\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
5, Regex sẽ chấp nhận chuỗi
/\b(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b/gm
6. 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ạp

Lậ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é