tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu BIỂU THỨC CHÍNH QUY VÀ THƯ VIỆN BIỂU THỨC CHÍNH QUY CỦA CÁC NGÔN NGỮ LẬP TRÌNH PHP, JAVA, .NET

13 840 1
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu BIỂU THỨC CHÍNH QUY VÀ THƯ VIỆN BIỂU THỨC CHÍNH QUY  CỦA CÁC NGÔN NGỮ LẬP TRÌNH PHP, JAVA, .NET

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG    BÀI TIỂU LUẬN BIỂU THỨC CHÍNH QUY VÀ THƯ VIỆN BIỂU THỨC CHÍNH QUY CỦA CÁC NGÔN NGỮ LẬP TRÌNH PHP, JAVA, NET Giáo viên hướng dẫn: TS Nguyễn Hữu Đức Học viên thực : Đỗ Ngọc Phục CB120105 Lê Gia Vĩnh CB120125 Nguyên Hồng Tâm CB120110 Lớp : Công nghệ thông tin (KT) Đề : Đề số HÀ NỘI 12 – 2012 Mục lục I Định nghĩa biểu thức quy (regular expression defined) Biểu thức quy (regular expression, viết tắt regexp, regex hay regxp) chuỗi miêu tả chuỗi khác, theo quy tắc cú pháp định Biểu thức quy thường dùng trình biên tập văn tiện ích tìm kiếm xử lý văn dựa mẫu quy định Nhiều ngôn ngữ lập trình hỗ trợ biểu thức quy việc xử lý chuỗi, chẳng hạn C#, Perl có máy mạnh mẽ để xử lý biểu thức quy xây dựng trực tiếp cú pháp chúng Bộ trình tiện ích (gồm trình biên tập SED trình lọc GREP) kèm phân phối Unix có vai trò việc phổ biến khái niệm biểu thức quy Thuật ngữ regular expression xuất phát từ lý thuyết toán học khoa học máy tính, phản ánh đặc điểm biểu thức toán học gọi quy (regularity) Một biểu thức thực phần mềm cách sử dụng xác định giới hạn tự động (Deterministic Finite Automation – DFA) DFA trạng thái xác định không sử dụng chế quay lui (backtracking) Nếu sử dụng tốt kỹ regular expression Chúng đơn giản nhiều lập trình trình xử lý văn bản, có vấn đề giải không sử dụng regular expression Sẽ cần đến hàng trăm thủ tục để trích xuất tất địa email từ số tài liệu, nói việc làm tẻ nhạt vất vã Nhưng với regular expression cần số dòng lệnh chí dòng lệnh để làm việc Tuy nhiên, Regular expression thường đem đến cho người sử dụng phiền toái không mong muốn như: sử dụng biểu thức quy không phù hợp với biểu thức muốn tìm, số văn tìm với biểu thức quy không phù hợp… Để sử dụng regular expression cần phải có kiến thức từ đến nâng cao biểu thức cách thức hoạt động ngôn ngữ lập trình Regular expression công cụ mạnh mẽ việc thao tác trích xuất văn máy tính Do nắm vững biểu thức quy giúp tiết kiệm nhiều thời gian công sức Có thể hiểu đơn giản Regex mẫu (pattern) dùng để mô tả lớp ký tự VD: lazydog regex Nó mẫu đơn giản so khớp (match) với đoạn văn lazydog match đoạn văn so khớp với mẫu VD phức tạp chút: \b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b Đây mẫu mô tả địa email Mẫu dùng để tìm địa email đoạn văn bản, kiểm tra xem chuỗi có phải địa email hợp lệ hay không Regex sử dụng với liệu mà ta truy cập, thông qua ứng dụng ngôn ngữ lập trình Có thể kể đến số ứng dụng xử lý văn hỗ trợ regex: PowerGREP, EditPad Pro, RegexBuddy,… II Regular Expression Engine Khái niệm Regex engine phận phần mềm, chuyên để xử lý regex (so khớp mẫu với chuỗi đó) Có nhiều regex engine chúng không hoàn toàn tương thích với Cú pháp regex (flavor) engine có khác Ở tập trung vào cú pháp regex sử dụng Perl 5, phổ biến Rất nhiều engine regex khác giống với engine sử dụng Perl 5: engine nguồn mở PCRE (sử dụng nhiều ngôn ngữ lập trình, PHP), thư viện regex NET, … Ký tự thông thường ký tự đặc biệt a Ký tự thông thường (Literal Characters) Regex biểu thức bao gồm ký tự thông thường, VD: a Nó so khớp với thực thể ký tự chuỗi VD có chuỗi: LazyDog is a boy, so khớp với ký tự a sau ký tự L Regex so khớp với ký tự a thứ ta điều khiển regex engine tiếp tục tìm kiếm sau so khớp lần Cũng vậy, regex dog so khớp với dog chuỗi LazyDog is not a dog Regex bao gồm chuỗi ký tự thông thường Engine hiểu biểu thức là: tìm d, theo sau o, theo sau g Chú ý regex engine mặc định phân biệt chữ hoa chữ thường Dog không so khớp với dog b Ký tự đặc biệt (Special Characters) Vì ta cần làm nhiều công việc phức tạp tìm kiếm đoạn văn bản, phải trưng dụng vài ký tự để làm nhiệm vụ đặc biệt Trong cú pháp regex, có 11 ký tự mang ý nghĩa đặc biệt: [ \ ^ $ | ? * + ( ) Chúng gọi metacharacter Nếu cần dùng ký tự với ý nghĩa thông thường, ta phải giải phóng ký tự \ VD cần so khớp 1+1=2, regex 1\+1=2 Chú ý 1+1=2 regex đúng, nên không báo lỗi, không cho ta kết mong muốn Regex 1+1=2 so khớp với 111=2 chuỗi 123+111=234, dấu + mang ý nghĩa đặc biệt Nếu ta quên không giải phóng ký tự đặc biệt chỗ không phép đứng gặp lỗi VD: +1 Hầu hết loại cú pháp regex coi { ký tự thông thường, trừ phần toán tử nhắc lại (repetition operator), VD: {1, 3} Vì ta không cần giải phóng ký tự Ta dùng \ để giải phóng ký tự đặc biệt, ký tự khác không nên, \ ký tự đặc biệt \ kết hợp với ký tự thông thường có ý nghĩa đặc biệt, VD: \d so khớp với chữ số từ - Tất loại cú pháp regex cho phép giải phóng ký tự đặc biệt \ Rất nhiều cú pháp khác hỗ trợ kiểu giải phóng \Q \E Tất ký tự nằm cặp \Q \E coi ký tự thông thường VD: \Q*\d+*\E so khớp với đoạn văn *\d+* Kiểu cú pháp hỗ trợ JGsoft engine, Perl, PCRE, c Ký tự đặc biệt ngôn ngữ lập trình Khác với ngôn ngữ lập trình, regex, ký tự ' " ký tự đặc biệt Vì vậy, không cần phải giải phóng Trong mã nguồn chương trình, cần ghi nhớ ký tự ngôn ngữ lập trình xử lý đặc biệt Bởi ký tự trình biên dịch xử lý trước engine regex xử lý VD: regex 1\+1=2 phải viết thành 1\\+1=2 mã nguồn C++ Trình biên dịch C++ chuyển \\ thành \ chuỗi trên, sau chuyển đến regex engine VD khác: đế so khớp c:\temp, cần dùng regex c:\\temp (vì \t regex mang ý nghĩa đặc biệt) Và mã nguồn C++, regex cần viết c:\\\\temp d Ký tự không in Có thể dùng tổ hợp ký tự đặc biệt để đặt ký tự không in vào regex \t cho ký tự tab (ASCII 0x09) \r cho carriage return (0x0D) \n cho line feed (0x0A) \a (bell, 0x07) \e (escape, 0x1B) \f (form feed, 0x0C) \v (vertical tab, 0x0B) Trong tệp văn Windows sử dụng \r\n để kết thúc dòng, UNIX sử dụng \n Có thể dùng cách để viết ký tự biết mã 16 ASCII ký tự bảng mã dùng VD: bảng mã Latin-1, ký tự copyright có mã 0xA9 Vì để tìm ký tự này, ta dùng \xA9 Hầu hết loại cú pháp regex cho phép sử dụng tổ hợp \cA đến \cZ (c cố định, theo sau chữ hoa từ A - Z) để biểu thị ký tự điều khiển VD: \cA biểu thị Control+A \cM biểu thị Control+M, hay carriage return, giống \r Nếu regex engine hỗ trợ Unicode, ta sử dụng \uFFFF thay cho \xFF để biểu thị ký tự Unicode VD: mã unicode ký tự đồng euro 0x20AC Để đặt vào biểu thức regex, ta dùng \u20AC Cách thực Regex Engine Hiểu cách làm việc regex engine giúp ta viết regex tốt hơn, dễ dàng Nó giúp ta hiểu regex hoạt động không mong muốn, giúp tiết kiệm thời gian phải mò mẫm viết regex phức tạp Có loại regex engine: text-directed engines, regex-directed engines Loại cú pháp regex mà ta thảo luận thuộc loại regex-directed engines Loại engine phổ biến có số chức hữu dụng như: lazy quantifiers, backreferences, Có thể dễ dàng kiểm tra xem loại cú pháp sử dụng thuộc engine qua việc kiểm tra xem lazy quantifiers backreferences có hỗ trợ không Hãy thử dùng biểu thức regex regex|regex not vào chuỗi regex not Nếu kết so khớp regex, engine dùng thuộc loại regex-directed Nêu kết regex not, engine thuộc loại text-directed Trong VD tiếp theo, ta phân tích cụ thể cách thức làm việc regex engine, qua giúp sử dụng regex hiệu tránh mắc lỗi Regex-directed engine trả kết so khớp bên trái nhất, chí match tốt tìm thấy tiếp tục so khớp Đây điều cần ghi nhớ Regex-directed engine bắt đầu so khớp với ký tự chuỗi Hãy lấy VD đơn giản để minh hoạ: ta dùng regex cat vào chuỗi “He captured a catfish for his cat” Engine bắt đầu so khớp dấu regex c với ký tự chuỗi H Không khớp, tiếp tục so khớp với ký tự thứ e space Đều không khớp, đến ký tự thứ 4, c khớp với c Xong, engine bắt đầu so khớp dấu hiệu thứ regex a với ký tự thứ chuỗi a, khớp, đến dấu hiệu thứ regex t không khớp với ký tự thứ chuỗi p Lúc engine nhận tìm match ký tự thứ chuỗi Vì vậy, bắt đầu lại công việc từ đầu, từ ký tự thứ chuỗi, regex c không khớp với a Cứ tiếp tục ký tự thứ 15 chuỗi, regex c khớp với c Engine so khớp dấu hiệu lại regex với ký tự chuỗi: a khớp a, t khớp t Và match tìm thấy ký tự 15 Engine trả kết ngừng luôn, không tiếp tục tìm xem match tốt không (VD: cat cuối chuỗi) Lớp ký tự (Character Classes - Character Sets) a Lớp ký tự Sử dụng lớp ký tự, ta khiến regex engine chọn ký tự để so khớp Để sử dụng, ta đặt ký tự cần so khớp vào dấu [ ] VD: để so khớp ký tự a e, ta dùng [ae] Như biểu thức gr[ae]y khớp với gray grey Lớp ký tự so khớp với ký tự đơn Như gr[ae]y không khớp với graay, graey,v.v… Thứ tự ký tự lớp không quan trọng Kết trả giống Để xác định vùng ký tự lớp ký tự, ta sử dụng dấu - VD: [0-9] so khớp với chữ số từ – Có thể sử dụng nhiều vùng ký tự kết hợp vùng ký tự với ký tự đơn VD: [0-9a-fA-F] so khớp với chữ số hệ 16, không phân biệt chữ hoa, thường [0-9a-fxA-FX] so khớp với chữ số hệ 16 chữ X, không phân biệt chữ hoa, thường Cũng trên, thứ tự vùng không quan trọng b Lớp ký tự phủ định Đặt dấu ^ sau [ lớp ký tự phủ định lớp ký tự Kết lớp ký tự so khớp với ký tự không nằm lớp ký tự Lớp ký tự phủ định so khớp với ký tự line break Chú ý lớp ký tự phủ định phải so khớp với ký tự VD: q[^u] “q không theo sau u” mà “q theo sau ký tự u” Vì không so khớp với q chuỗi Iraq, so khớp với q space chuỗi Iraq is a country c Metacharacter lớp ký tự Trong lớp ký tự, ký tự mang ý nghĩa đặc biệt hay metacharacter bao gồm: ] \ ^ - Các metacharacter nói phần trước đặt lớp ký tự coi ký tự thông thường, không cần phải giải phóng VD: để tìm ký tự * +, ta dùng [+*] Để đặt ký tự \ vào lớp ký tự với nghĩa thông thường, cần giải phóng ký tự \ khác VD: [\\x] khớp với ký tự \ x Các ký tự ] ^ - muốn dùng theo nghĩa thông thường phải giải phóng \ đặt vị trí mà ý nghĩa đặc biệt Ta nên dùng cách thứ để biểu thức regex trông dễ nhìn sau: • Với ^, đặt chỗ trừ vị trí sau [ VD: [x^] khớp với x ^ • Với ], đặt sau [ [^ VD: []x] khớp với ] x [^]x] khớp với ký tự ] x • Với -, đặt sau [ [^ , trước ] VD: [-x] [x-] so khớp với - x Có thể sử dụng tất ký tự không in lớp ký tự giống dùng chúng lớp ký tự VD: [$\u20AC] khớp với $ ký tự đồng euro (với giả định cú pháp regex dùng hỗ trợ unicode) JGsoft engine, Perl PCRE hỗ trợ kiểu \Q…\E lớp ký tự để giải phóng chuỗi ký tự VD: [\Q[-]\E] khớp với [ - ] Cú pháp regex POSIX lại xử lý \ lớp ký tự ký tự thông thường Đồng nghĩa với việc ta dùng \ để giải phóng ] ^ - Để làm việc ta cách đặt chúng vào vị trí trình bày Ngoài điều đồng nghĩa với việc cú pháp tắt (shorthand, VD: \d) không hiệu lực d Lớp ký tự viết tắt (Shorthand Character Classes) \d dạng tắt [0-9] \w gọi “ký tự từ” (word character) Chính xác ký tự khớp với thay đổi tuỳ theo loại cú pháp regex Trong tất loại cú pháp, bao gồm [A-Za-z] Trong hầu hết loại cú pháp, bao gồm dấu _ chữ số \s gọi “ký tự trắng” (whitespace character) Nó khớp với ký tự tùy thuộc vào loại cú pháp Trong kiểu cú pháp thảo luận đây, bao gồm [\t] Nghĩa \s khớp với space tab Trong hầu hết cú pháp , bao gồm ký tự carriage return line feed, nghĩa [\t\r\n] Một số cú pháp khác lại bao gồm thêm ký tự không in dùng vertical tab form feed Các lớp ký tự viết tắt dùng lẫn cặp [] VD: \s\d khớp với ký tự trắng theo sau chữ số [\s\d] khớp với ký tự đơn ký tự trắng chữ số Khi áp dụng vào chuỗi + = 3, regex thứ khớp với (space 2), regex thứ khớp với [\da-fA-F] khớp với chữ số hệ 16, giống [0-9a-fA-F] e Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes) \D tương đương [^\d] \W tương đương [^\w] \S tương đương [^\s] Cần thận trọng sử dụng dạng viết tắt phủ địng bên [] [\D\S] khác với [^\d\s] Regex thứ khớp với ký tự chữ số ký tự trắng Còn regex thứ khớp với ký tự chữ số ký tự trắng Và chữ số ký tự trắng ký tự trắng chữ số [\D\S] khớp với ký tự nào, bao gồm ký tự trắng chữ số f Nhắc lại lớp ký tự (Repeating Character Classes) Nếu nhắc lại lớp ký tự dùng toán tử nhắc lại ? * + , ta nhắc lại lớp ký tự không nhắc lại ký tự mà so khớp VD: regex [0-9]+ khớp với 837 lẫn 222 Nếu muốn nhắc lại ký tự so khớp, ta cần dùng tham chiếu ngược (backreferences) ([0-9])\1+ khớp với 222 không khớp với 837 Khi áp dùng regex vào chuỗi 833337, khớp với 3333 g Ký tự chấm (Dot) Ký tự Dot khớp với hầu hết ký tự Trong biểu thức regex, dấu metacharacter sử dụng nhiều nhất, ký tự bị sử dụng sai nhiều Dấu khớp với ký tự đơn ngoại trừ ký tự newline Vì vậy, dấu tương đương với [^\n] (trong UNIX) [^\r\n] (trong Windows) Trong Perl, dấu khớp với newline ta dùng chế độ “single-line mode” Để sử dụng chế độ này, ta thêm s vào sau biểu thức regex, VD: m/^regex$/s; JavaScript VBScript chế độ hỗ trợ Dot so khớp với ký tự line break Vì vậy, để so khớp với ký tự ta phải dùng [\s\S] thay cho Dot [\s\S] so khớp với ký tự ký tự trắng (bao gồm ký tự line break) ký tự trắng, nghĩa so khớp với ký tự Dấu metacharacter đầy uy lực Nó khớp với ký tự nào, khớp với ký tự mà ta không muốn Những trường hợp khó nhận Hãy lấy VD đơn giản để minh hoạ: giả sử ta muốn tìm chuỗi ngày tháng năm dạng mm/dd/yy, dấu phân cách ngày tháng năm ta để người dùng tuỳ chọn Giải pháp nhanh \d\d.\d\d.\d\d, trông ổn Nó khớp chuỗi kiểu 02/12/03 Vấn đề chuỗi kiểu 02512703 coi ngày hợp lệ với regex (chấm thứ khớp với 5, chấm thứ khớp với 7) Giải pháp tốt là: \d\d[- /.]\d\d[- /.]\d\d Regex cho phép – space / làm dấu phân cách ngày tháng năm Lưu ý dấu lớp ký tự ký tự thông thường, không cần phải giải phóng Nhưng regex chưa hoàn hảo, coi 99/99/99 ngày hợp lệ Giải pháp tiếp theo: [0-1]\d[- /.][0-3]\d[- /.]\d\d Ổn chưa hoàn hảo, khớp với 19/39/99 Chất lượng regex tuỳ thuộc vào yêu cầu bạn VD muốn thẩm định thông tin nhập vào từ người dùng regex phải thật hoàn hảo Còn phân tích file liệu mà bạn biết mã nguồn tạo file theo cách thức regex mức vừa đủ mà Sử dụng lớp ký tự phủ định thay cho Dot: Giả sử ta cần tìm chuỗi bao ” “ Chuỗi có ký tự tuỳ thích, “.*” ổn Dấu khớp với ký tự nào, dấu * cho phép nhắc lại lần tuỳ thích, kể lần Nếu áp dụng regex vào chuỗi Put a “string” between double quotes, trả kết mong đợi: “string” Giờ thử với chuỗi Houston, we have a problem with “string one” and “string two” Please respond Và kết “string one” and “string two”, sai Lý * vốn có tính “tham lam” (greedy) VD cho thấy không nên lạm dụng dấu chấm Trong VD tìm ngày trên, ta cải tiến regex cách sử dụng lớp ký tự thay cho dấu chấm Giờ ta làm Ta không muốn có số lượng ký tự cặp dấu ” “, mà muốn có số lượng ký tự ” newline cặp dấu ” “ Do regex là“[^"\r\n]*” h Mỏ neo (anchors) Neo đầu cuối chuỗi, từ đầu đến giờ, ta tìm hiểu ký tự thông thường lớp ký tự Đặt ký tự thông thường lớp ký tự vào biểu thức regex, ta bắt regex engine so khớp với ký tự đơn Mỏ neo thuộc dạng khác Chúng không so khớp với ký tự Thay vào đó, chúng so khớp với vị trí trước, sau ký tự Chúng sử dụng để “neo” biểu thức regex vào vị trí để so khớp Dấu ^ khớp với vị trí trước ký tự chuỗi Áp dụng regex ^a cho chuỗi abc, ta a ^b kết so khớp với abc, b không khớp với ký tự sau vị trí bắt đầu chuỗi, vị trí khớp ^ Tương tự trên, $ khớp với vị trí sau ký tự cuối chuỗi c$ khớp với c abc, a$ không khớp III Biểu thức quy ngôn ngữ lập trình Ngôn ngữ PHP Trong PHP, ta sử dụng biểu thức regex thông qua hàm regex PHP cung cấp nhóm hàm regex, tên chúng bắt đầu bởi: ereg, mb_ereg preg loại đầu sử dụng engine POSIX Extended, preg sử dụng engine PCRE (PerlCompatible) Xét đoạn mã PHP sau: Nó lên hình kết so khớp biểu thức regex với chuỗi mà áp dụng regex vào Như thấy trên, ta dùng nhóm hàm preg sử dụng engine PCRE giống với engine Perl Ngôn ngữ C# NET Biểu thức quy xuất phát từ môi trường UNIX, đuợc dùng với PERL Microsoft cho vào Windows sử dụng với ngôn ngữ kịch Biểu thức quy hổ trợ số lớp NET namespace : System.Text.RegularExpressions Biểu thức quy NET framework kết hợp tính phổ biến biểu thức quy khác thực Perl awk Được thiết kế để tương thích với biểu thức quy Perl biểu thức quy NET Framework bao gồm tính chưa thấy hệ thống xử lý quy khác, so khớp phải sang trái biên soạn kiểu on-the-fly NET Framework thể lớp phần thư viện lớp sở sử dụng với ngôn ngữ hay công cụ mà mục tiêu thực runtime, bao gồm ASP.NET Visual Studio 2005 Lớp biểu thức quy NET Framework phần thư viện lớp sở sử dụng với ngôn ngữ công cụ có dẫn biên dich CLR, bao gồm ASP.NET Những lớp NET RegularExpressions hỗ trợ groups captures, lớp Group Capture Cũng có lớp GroupCollection CaptureCollection , mà trình bày việc thu thập groups captures Lớp Match thể phương thức Group() trả đối tượng GroupCollection Lớp Group thi hành phương thức Captures() trả CaptureCollection Mối quan hệ đối tượng thể qua biểu đồ sau: việc trả đối tượng Group lần ta muốn nhóm số kí tự với ta muốn làm Có số overhead liên quan đến việc khởi tạo đối tượng, mà bị lãng phí tất ta muốn nhóm vài kí tự phần pattern ta không cho phép điều việc bắt đầu nhóm với chuỗi kí tự ?: cho nhóm riêng cho tất nhóm việc định cờ RegExOptions.ExplicitCaptures phương thức REgEX.Matches() Ngôn ngữ Java Năng lực biểu thức quy ngôn ngữ Java gồm có ba lớp cốt lõi sử dụng lúc: Pattern, mô tả mẫu chuỗi ký tự • Matcher, để kiểm tra chuỗi ký tự xem có khớp với mẫu không • PatternSyntaxException, để báo cho bạn số thứ chấp nhận với mẫu mà bạn thử định nghĩa Cách tốt để tìm hiểu biểu thức quy qua ví dụ, phần tạo ví dụ đơn giản CommunityApplication.main() Tuy nhiên, trước tiến hành, điều quan trọng hiểu số cú pháp mẫu biểu thức quy Chúng ta thảo luận điều chi tiết phần • [...]... Windows và cho đến hiện tại thì nó hầu như được sử dụng với những ngôn ngữ kịch bản Biểu thức chính quy được hổ trợ bởi một số lớp NET trong namespace : System.Text.RegularExpressions Biểu thức chính quy của NET framework kết hợp các tính năng phổ biến nhất của biểu thức chính quy khác thực hiện được như trong Perl và awk Được thiết kế để tương thích với biểu thức chính quy trong Perl 5 biểu thức chính quy. .. các tính năng chưa từng thấy trong các hệ thống xử lý chính quy khác, như so khớp phải sang trái và biên soạn kiểu on-the-fly NET Framework thể hiện các lớp như là một phần của thư viện lớp cơ sở và có thể được sử dụng với bất kỳ ngôn ngữ nào hay các công cụ mà các mục tiêu thực hiện runtime, bao gồm cả ASP.NET và Visual Studio 2005 Lớp biểu thức chính quy trong NET Framework là một phần của thư viện. .. vị trí bắt đầu của chuỗi, vị trí được khớp bởi ^ Tương tự như trên, $ khớp với vị trí ngay sau ký tự cuối cùng của chuỗi c$ sẽ khớp với c trong abc, trong khi a$ không khớp III Biểu thức chính quy trong các ngôn ngữ lập trình 1 Ngôn ngữ PHP Trong PHP, ta có thể sử dụng biểu thức regex thông qua các hàm regex PHP cung cấp 3 nhóm hàm regex, tên của chúng được bắt đầu bởi: ereg, mb_ereg và preg 2 loại... Neo đầu và cuối chuỗi, từ đầu đến giờ, ta đã tìm hiểu về các ký tự thông thư ng và lớp ký tự Đặt 1 ký tự thông thư ng hoặc 1 lớp ký tự vào biểu thức regex, ta sẽ bắt regex engine đi so khớp với 1 ký tự đơn Mỏ neo thuộc về 1 dạng khác Chúng không so khớp với bất kỳ 1 ký tự nào Thay vào đó, chúng so khớp với 1 vị trí trước, sau hoặc giữa các ký tự Chúng được sử dụng để “neo” biểu thức regex vào 1 vị... dụng biểu thức regex‘; $pattern = ‘ /biểu thức regex/’; preg_match($pattern, $string, $match); echo $match[0]; ?> Nó sẽ hiện lên màn hình kết quả so khớp biểu thức regex với chuỗi mà đã áp dụng regex vào Như thấy ở trên, ta dùng nhóm hàm preg vì nó sử dụng engine PCRE rất giống với engine của Perl 2 Ngôn ngữ C# NET Biểu thức chính quy xuất phát từ môi trường UNIX, đuợc dùng với PERL Microsoft cho nó vào... phương thức REgEX.Matches() 3 Ngôn ngữ Java Năng lực về biểu thức chính quy của ngôn ngữ Java gồm có ba lớp cốt lõi sẽ sử dụng hầu như mọi lúc: Pattern, trong đó mô tả một mẫu chuỗi ký tự • Matcher, để kiểm tra một chuỗi ký tự xem nó có khớp với mẫu không • PatternSyntaxException, để báo cho bạn rằng một số thứ không thể chấp nhận được với mẫu mà bạn đã thử định nghĩa Cách tốt nhất để tìm hiểu về biểu thức. .. là một phần của thư viện lớp cơ sở và có thể được sử dụng với bất kỳ ngôn ngữ hoặc công cụ có chỉ dẫn biên dich CLR, bao gồm cả ASP.NET Những lớp NET RegularExpressions hỗ trợ groups và captures, là những lớp Group và Capture Cũng có những lớp GroupCollection và CaptureCollection , mà trình bày việc thu thập groups và captures Lớp Match thể hiện 1 phương thức Group() và trả về 1 đối tượng GroupCollection... được với mẫu mà bạn đã thử định nghĩa Cách tốt nhất để tìm hiểu về biểu thức chính quy là qua các ví dụ, do đó trong phần này chúng ta sẽ tạo ra một ví dụ đơn giản trong CommunityApplication.main() Tuy nhiên, trước khi chúng ta tiến hành, điều quan trọng là hiểu được một số cú pháp mẫu biểu thức chính quy Chúng ta sẽ thảo luận điều đó chi tiết hơn trong phần kế tiếp • ... “string two” Please respond Và kết quả là “string one” and “string two”, đã sai Lý do là vì * vốn có bản tính “tham lam” (greedy) VD này cho thấy không nên lạm dụng dấu chấm Trong VD tìm ngày ở trên, ta cải tiến regex bằng cách sử dụng lớp ký tự thay cho dấu chấm Giờ ta cũng làm như vậy Ta không muốn có số lượng bất kỳ các ký tự bất kỳ trong cặp dấu ” “, mà muốn có số lượng bất kỳ các ký tự không phải là... GroupCollection Lớp Group thi hành 1 phương thức Captures() và trả về 1 CaptureCollection Mối quan hệ giữa những đối tượng được thể hiện qua biểu đồ sau: việc trả về 1 đối tượng Group mỗi lần ta muốn nhóm 1 số kí tự cùng với nhau có thể không phải là những gì ta muốn làm Có 1 số overhead liên quan đến việc khởi tạo đối tượng, mà bị lãng phí nếu tất cả những gì ta muốn là nhóm một vài kí tự cùng nhau như là 1 phần ... ta muốn nhóm số kí tự với ta muốn làm Có số overhead liên quan đến việc khởi tạo đối tượng, mà bị lãng phí tất ta muốn nhóm vài kí tự phần pattern ta không cho phép điều việc bắt đầu nhóm với... vài kí tự phần pattern ta không cho phép điều việc bắt đầu nhóm với chuỗi kí tự ?: cho nhóm riêng cho tất nhóm việc định cờ RegExOptions.ExplicitCaptures phương thức REgEX.Matches() Ngôn ngữ Java... ngữ lập trình Ngôn ngữ PHP Trong PHP, ta sử dụng biểu thức regex thông qua hàm regex PHP cung cấp nhóm hàm regex, tên chúng bắt đầu bởi: ereg, mb_ereg preg loại đầu sử dụng engine POSIX Extended,

Ngày đăng: 17/04/2016, 21:26

Từ khóa liên quan

Mục lục

  • I. Định nghĩa biểu thức chính quy (regular expression defined)

  • II. Regular Expression Engine

    • 1. Khái niệm

    • 2. Ký tự thông thường và ký tự đặc biệt

      • a. Ký tự thông thường (Literal Characters)

      • b. Ký tự đặc biệt (Special Characters)

      • c. Ký tự đặc biệt và ngôn ngữ lập trình

      • d. Ký tự không in được

      • 3. Cách thực hiện của Regex Engine

      • 4. Lớp ký tự (Character Classes - Character Sets)

        • a. Lớp ký tự

        • b. Lớp ký tự phủ định

        • c. Metacharacter trong lớp ký tự

        • d. Lớp ký tự viết tắt (Shorthand Character Classes)

        • e. Lớp ký tự viết tắt phủ định (Negated Shorthand Character Classes)

        • f. Nhắc lại lớp ký tự (Repeating Character Classes)

        • g. Ký tự chấm (Dot)

        • h. Mỏ neo (anchors)

        • III. Biểu thức chính quy trong các ngôn ngữ lập trình

          • 1. Ngôn ngữ PHP

          • 2. Ngôn ngữ C# .NET

          • 3. Ngôn ngữ Java

Tài liệu cùng người dùng

Tài liệu liên quan