Regex là gì?
Nếu như bạn là một lập trình viên, ắt hẳn khái niệm Regex là gì cũng không còn xa lạ đối với bạn. Ứng dụng hầu hết của Regex là kiểm tra tính hợp lệ của email hay số điện thoại... Vậy Regex được hiểu như thế nào?
Khái niệm Regex
Regex được mô tả lần đầu bởi Stephen Cole Kleene vào năm 1951 thông qua các ký tự toán học. Ông cũng gọi đó là Regular Events - sự kiện thường xuyên. Phải đến vào cuối khoảng thế kỷ 20 thì việc dùng biểu thức Regex mới phổ biến trong khoa học máy tính.
Regex là gì? - Regex được viết tắt từ Regular Expression (biểu thức chính quy). Đây là một chuỗi các ký tự đặc biệt để tạo nên mẫu (pattern). Nhiệm vụ chính của Regex là phân tích cú pháp, tìm kiếm, sự trùng hợp hay thay thế các đoạn/ chuỗi ký tự.
Về cơ bản, Regex không phải là ngôn ngữ lập trình. Nó chỉ đơn giản là bộ cú pháp dùng để xử lý chuỗi. Người lập trình không phải "còng lưng" copy paste hàng tá code. Tất cả những gì bạn cần làm để xử lý "mớ bòng bong" code là sử dụng Regex.
Các cú pháp về Regular Expression
Ý nghĩa | Ví dụ | Examplex that this will match | |
^ | Bắt đầu các chuỗi nhập | ^B | B,nhưng chỉ nêu kí tự đầu tiên trong chuỗi |
$ | Kết thúc của chuỗi nhập | X$ | X, nhưng chỉ nêu ký tự cuối cùng trong chuỗi |
. | Bất kỳ ký tự nào ngoại trừ ký tự xuống dòng (\n) | i.ation | isation, ization |
* | Ký tự trước có thể được lặp lại 0 hoặc nhiều lần | ra*t | rt, rat, raat, raaat, and so on |
+ | Ký tự trước có thể được lặp lại 1 hoặc nhiều lần | ra+t | rat, raat, raaat, and so on (but not rt) |
? | Ký tự trước có thể được lặp lại 0 hoặc 1 lần | ra?t | rt and rat only |
\s | Bất kỳ ký tự khoảng trắng | \sa | [space]a, \ta, \na (\t and \n có ý nghĩa tương tự C#) |
\S | Bất kỳ ký tự nào, miễn không phải là khoảng trắng | \SF | aF, rF, cF, but not \tf |
\b | Từ biên | ion\b | any word ending in ion |
\B | Bất kỳ vị trí nào không phải là từ biên | \BX\B | Bất kỳ ký tự X ở giữa của 1 từ |
Tham khảo: Mastercode
Regex được dùng để làm gì?
Vậy ứng dụng của Regex là gì? Biểu thức này có thực sự cần thiết cho lập trình viên không? Hãy cùng tìm hiểu tiếp nhé!
- Kiểm tra tính hợp lệ và so khớp bất kỳ thứ gì miễn là có quy tắc rõ ràng: kiểm tra tính hợp lệ của email, so khớp các ký tự trong cùng chuỗi từ a đến z, so khớp và tiến hành kiểm tra URL có phù hợp hay không, kiểm tra tính hợp lệ của số điện thoại...
- Tìm kiếm và thay thế: trong các phần mềm lập trình không có kết hợp Regex, ắt hẳn bạn sẽ chẳng thể sử dụng Ctrl + H để tìm kiếm. Nhưng kho có Regex, nó sẽ hỗ trợ bạn tìm ký tự.
» Xem thêm: Neural network là gì? Tổng quan về neural network có thể bạn cần biết
Các khái niệm cơ bản về Regex
Biểu thức quy chung thường để chỉnh định một xâu các xâu cần trong một mục đích cụ thể. Tuy nhiên, chúng ta thường có nhiều cách ngắn gọn hơn để chỉ định bộ xâu mà mình muốn. Một số khái niệm cơ bản khác về Regex là gì?
“Or”
"Or" là một thanh chiều dọc ngăn cách các lựa chọn được thay thế. Ví dụ: gray|grey (có thể khớp với cả "gray" hoặc "grey").
Phân nhóm
Một dấu ngoặc đơn được sử dụng nhằm để xác định phạm vi và mức độ ưu tiên của các toán tử. Ví dụ như: gray|grey và gr(a|e)y là hai mẫu tương đương nhau. Nó đều đang mô tả tập hợp "gray" hoặc "grey".
Định lượng
Trong bộ định lượng sau mã thống báo (ký tự) hay nhóm chỉ định về tần suất khi phần tử trước có khả năng xảy ra thì các định lượng phổ biến nhất là các ký tự "?, *, +":
- Dấu hỏi "?": chỉ ra 0 hoặc 1 lần xuất hiện của phần tử trước.
- Dấu hoa thị "*": cho biết không có hoặc nhiều lần xuất hiện của phần tử ở trước.
- Dấu cộng "+": cho biết 1 hoặc nhiều lần xuất hiện của phần tử ở trước.
Ngoài ra, còn có:
- {n}: mục trước khớp chính xác n lần.
- {min,}: mục trước khớp mức tối thiểu hay nhiều lần hơn.
- {min,max}: mục trước khớp ít nhất số lần tối thiểu nhưng không được quá số lần tối đa.
Ký tự đại diện
Những ký tự đại diện "." sẽ phù hợp với mọi ký tự. Chẳng hạn như "a.b" sẽ khớp với bất kỳ xâu vào có chứa "a". Sau đó, mọi ký tự nào khác, sau nữa là "b". "a.*b" sẽ khớp với bất kỳ xâu nào chứa "a" và "b" ở điểm duy nhất nào sau đó.
Những cấu trúc từ ký tự đại diện có thể kết hợp thành biểu thức phức tạp tùy theo ý lập trình viên. Tương tự như chúng ta có thể tạo các biểu thức tính toán từ các số và phép toán +, -, x và :. Ví dụ như H(ae?|ä)ndel và H(a|ae|ä)ndel đều là mẫu hợp lệ với các xâu trước đó.
Các lý thuyết về ngôn ngữ chính quy Regex trong Java
Những biểu thức chính quy mô tả ngôn ngữ trong lý thuyết về ngôn ngữ chính quy. Những lý thuyết này bao gồm:
ĐỊnh nghĩa chính thức
Biểu thức chính quy Regex sẽ bao gồm các hằng số, chúng biểu thị tập hợp của chuỗi và ký tự toán tử và biểu thị phép toán trên các tập hợp này. Các hằng số sau đây được định nghĩa là các biểu thức chính quy:
- (tập rỗng) ∅ là tập ∅.
- (chuỗi trống) ε biểu thị tập hợp chỉ chứa chuỗi "rỗng", không có ký tự khác.
- (ký tự chữ) a trong Σ biểu thị tập hợp chỉ chứa ký tự a.
Với những biểu thức chính quy R và S. Các thao tác sau được định nghĩa để tạo biểu thức chính quy:
- (Nối) (RS) là biểu thị tập hợp chuỗi thu được bằng cách nối 1 chuỗi được R chấp nhận. Một chuỗi được S chấp nhận (theo thứ tự). Ví dụ: Đặt R biểu thị {"ab", "c"} và S biểu thị cho {"đ", "ef"}. Sau đó, (RS) biểu thị cho {"abd", "abef", "cd", "cef"}.
- (Luân phiên) (R|S) biểu thị cho tập hợp của các tập hợp được mô tả bởi S và R. Ví dụ: R mô tả {"ab", "c"} và S mô tả {"ab", "d", "ef"}, thì biểu thức mô tả (R|S) { "ab", "c", "d", "ef"}.
- (Kleene star) biểu thị siêu tập hợp (R*) nhỏ nhất trong tập hợp được mô tả bởi R có chứa ε và được đóng dưới dạng nối chuỗi.
Để tránh dấu (), người ta cho rằng Kleene star có mức độ ưu tiên nhất. Tiếp đó sẽ là ghép nối > xen kẽ. Ví dụ: (ab)c có thể được viết là abc, và a|(b(c)) có thể được viết là a|bc.
Quyết định tính tương đương của Regex là gì?
Có rất nhiều cách để xây dựng biểu thức chính quy để cùng đạt được một kết quả. Lập trình viên có thể viết một thuật toán, đối với 2 Regex đã cho, quyết định xem các ngôn ngữ cùng miêu tả có bằng nhau không. Thuật toán sẽ phải rút gọn biểu thức thành máy trạng thái hữu hạn xác định tối thiểu và xác định xem thuật toán có tương đương nhau hay không.
Lập trình viên cũng có thể thu được các định luật đại số cho biểu thức Regex bằng cách sử dụng phương pháp của Gischer. Phương pháp này được ví dụ như sau: Để kiểm tra (X + Y) * và (X * Y *) có biểu thị cùng ngôn ngữ chính quy hay không, hãy cho tất cả biểu thức chính quy X, Y cần và đủ để kiểm tra Regex cụ thể (a+b) và (a*b) biểu thị cùng ngôn ngữ trên Σ={a, b}. Về tổng quát hơn, phương trình E = F giữa các thuật ngữ Regex với các biến đúng khi và chỉ khi. Sự tạo thành của nó với các biểu thức khác được thay thế bằng những ký hiệu khác nhau.
» Xem thêm: JavaScript: Ngôn ngữ linh hoạt đánh thức sức mạnh phát triển web
Khả năng biểu hiện và tính cô đọng
Regex tối thiểu phải thể hiện tính mục đích và tránh xác định ? và +. Những điều này có thể được diễn đạt như sau:a+= aa và a?= (a|ε). Đôi lúc toán tử phần bù thêm và đưa ra một biểu thức chính quy tổng quát mà ở đây là R khớp với tất cả các chuỗi trên Σ.
Về nguyên tắc, toán tử bổ sung thì tính là dư thừa vì nó không cấp thêm bất kỳ khả năng biểu đạt nào. Tuy nhiên, nó lại làm cho một biểu thức có tính ngắn gọn hơn nhiều. So với việc loại bỏ một toán tử phần bù duy nhất có thể gây tình trạng tăng gấp đôi độ dài theo hàm mũ.
Các biểu thức chính quy có thể biểu thị các ngôn ngữ chính quy. Chính xác đó là lớp ngôn ngữ được chấp nhận bởi automata. Tuy nhiên, có sự khác biệt về độ nhỏ gọn đáng kể. Một số lớp ngôn ngữ bình thường chỉ được mô tả bằng automata hữu hạn xác định có kích thước theo cấp số nhân.
Bất kỳ lập trình viên nào khi hiểu rõ về Regex là gì sẽ giúp công việc lập trình được loại bỏ những tác vụ phức tạp. Những thông tin trên đây từ Gofiber chỉ là một phần nhỏ trong hàng tá kiến thức về lập trình. Vì thế, hãy luôn học hỏi thêm kiến thức để không bị lạc hậu về lập trình nhé!
Việc thiết kế một trang web bán hàng mang lại nhiều lợi ích cho trải nghiệm mua hàng của khách hàng. Một trang web tốt sẽ cung cấp thông tin chi tiết về sản phẩm, hình ảnh hấp dẫn, chức năng tìm kiếm sản phẩm, giỏ hàng và quy trình thanh toán đơn giản, thuận tiện và an toàn. Tìm hiểu về dịch vụ thiết kế website chuyên nghiệp của Gofiber.