Biểu thức chính quy (regular expressions)

Một phần của tài liệu Ứng dụng máy vectơ hỗ trợ phân loại ý kiến của người xem trên các trang web phim trực tuyến (Trang 24 - 28)

CHƯƠNG 1: TỔNG QUAN BÀI TOÁN PHÂN LOẠI Ý KIẾN NGƯỜI DÙNG

1.4. Các bài toán và khái niệm cơ bản liên quan

1.4.1. Biểu thức chính quy (regular expressions)

Regular Expression hay còn gọi là biểu thức chính quy là một chuỗi ký tự mô tả mẫu văn bản, được dùng để xử lý chuỗi nâng cao thông qua biểu thức riêng của nó, những biểu thức này sẽ có những nguyên tắc riêng và ta phải tuân theo nguyên tắc đó thì biểu thức mới hoạt động được. Ngoài tên gọi Regular Expression ra thì nó còn có thể viết tắt thành RegEx.

RegEx đã trở thành kỹ thuật tiêu chuẩn được hỗ trợ bởi hầu hết các ngôn ngữ lập trình (ví dụ, .NET, Java, Python, Perl, Ruby, AWK và Tcl). Nhiều nghiên cứu xử lý ngôn ngữ tự nhiên sử dụng RegEx làm giải pháp cho một số bài toán con. Nguyên tắc hoạt động của biểu thức RegEx là so khớp dựa vào khuôn mẫu, khuôn mẫu được xây dựng từ các quy tắc căn bản của biểu thức RegEx. Khuôn mẫu được định nghĩa bởi biểu thức chính quy có thể khớp một hoặc một vài lần, hoặc không khớp với một văn bản cho trước. Những cụm từ thông dụng này thường được tạo bởi các nhà phát triển phần mềm làm việc với các chuyên gia miền. Vì không có cách tiêu chuẩn để tạo hoặc kiểm tra các biểu thức chính quy, việc bảo trì và mở rộng của chúng là một thách thức.

Về cơ bản Regex thường được ứng dụng với các mục đích sau:

- Giảm bớt những dòng lệnh trong quá trình xử lí chuỗi những biểu thức ngắn gọn mà vẫn đem lại kết quả như mong đợi.

- Kiểm tra tính hợp lệ của giá trị đầu vào ví dụ như các phần tử form

- Xử lí yêu cầu phức tạp trong chuỗi (bóc tách, thay đổi nội dung, loại bỏ ký tự…).

Một mẫu biểu thức chính quy là một tập các kí tự thường, như /abc/ sẽ tìm các các đoạn 'abc' theo đúng thứ tự đó trong các chuỗi, hay một tập kết hợp cả kí tự thường và kí tự đặc biệt như /ab*c/ hoặc /(\d+)\.\d*/. Các kí tự đặc biệt cho các mục đích tìm kiếm nâng cao mà tìm kiếm trực tiếp sẽ khó khăn như tìm một đoạn chứa một hoặc nhiều hơn một kí tự. Trong ví dụ cuối có sử dụng các dấu ngoặc đơn () như các thiết bị nhớ, tức là các mẫu trong phần () này sau khi được tìm kiếm có thể được nhớ lại để sử dụng cho các lần sau.

Ký tự Ý nghĩa Ví dụ

^ Khớp các kí tự đứng đầu một chuỗi.

Nếu có nhiều cờ này thì nó còn khớp được cả các kí tự đứng đầu của mỗi dòng (sau kí tự xuống dòng)

/^A/ sẽ không khớp được với 'A' trong "an A" vì 'A' lúc này không đứng đầu chuỗi, nhưng nó sẽ khớp "An E" vì lúc này 'A' đã đứng đầu chuỗi

$ So khớp ở cuối chuỗi. Nếu gắn cờ multiline (đa dòng), nó sẽ khớp ngay trước kí tự xuống dòng

/t$/ không khớp với 't' trong chuỗi

"eater" nhưng lại khớp trong chuỗi "eat"

* Cho phép kí tự trước nó lặp lại 0 lần hoặc nhiều lần. Tương đương với cách viết {0,}

/bo*/ khớp với 'boooo' trong chuỗi "A ghost booooed" nhưng không khớp trong chuỗi "A birth warbled"

+ Cho phép kí tự trước nó lặp lại 1 lần hoặc nhiều lần. Tương đương với cách viết {1,}

/a+/ khớp với 'a' trong chuỗi

"candy" và khớp với tất cả kí tự a liền nhau trong chuỗi

"caaaaaaandy"

? Cho phép kí tự trước nó lặp lại 0 lần hoặc 1 lần duy nhất. Tương đương với cách viết {0,1}

/e?le?/ khớp với 'el' trong chuỗi

"angel" và 'le' trong chuỗi "angle"

hay 'l' trong "oslo"

. Dấu . khớp với bất kì kí tự đơn nào ngoại trừ kí tự xuống dòng

/.n/ khớp với 'an' và 'on' trong chuỗi "no, an apple is on the tree", nhưng không khớp với 'no' (x) Khớp 'x' và nhớ kết quả so khớp này.

Các dấu ngoặc tròn được gọi là các dấu ngoặc có nhớ

Biểu mẫu /(foo) (bar) \1 \2/ khớp với 'foo' và 'bar' trong chuỗi "foo bar foo bar". \1 và \2 trong mẫu khớp với 2 từ cuối

(?:x) Khớp 'x' nhưng không nhớ kết quả so khớp. Những dấu ngoặc tròn được gọi là những dấu ngoặc không nhớ, nó cho phép định nghĩa những biểu thức con cho những toán tử so khớp

Xem xét biểu thức đơn giản /(?:foo){1,2}/. Nếu biểu thức này được viết là /foo{1,2}/, {1,2} sẽ chỉ áp dụng cho kí tự 'o' ở cuối chuỗi 'foo'. Với những dấu ngoặc không nhớ, {1,2} sẽ áp dụng cho cả cụm 'foo'.

x(?=y) Chỉ khớp 'x' nếu 'x' theo sau bởi 'y' /Jack(?=Sprat)/ chỉ khớp với 'Jack' nếu đằng sau nó là 'Sprat'.

/Jack(?=Sprat|Frost)/ chỉ khớp 'Jack' nếu theo sau nó là 'Sprat' hoặc 'Frost'. Tuy nhiên, cả 'Sprat' và 'Frost' đều không phải là một phần của kết quả so khớp trả về x(?!y) Chỉ khớp 'x' nếu 'x' không được theo

sau bởi 'y'

/\d+(?!\.)/ chỉ khớp với số không có dấu . đằng sau

x|y Khớp 'x' hoặc 'y' /green|red/ khớp với 'green' trong chuỗi "green apple" và 'red' trong chuỗi "red apple"

{n} Kí tự đứng trước phải xuất hiện n lần. n phải là một số nguyên dương

/a{2}/ không khớp với 'a' trong

"candy", nhưng nó khớp với tất cả kí tự 'a' trong "caandy", và khớp với 2 kí tự 'a' đầu tiên trong

"caaandy"

{n,m} Kí tự đứng trước phải xuất hiện từ n đến m lần. n và m là số nguyên dương

/a{1,3}/ không khớp bất kì kí tự nào trong "cndy", kí tự 'a' trong

và n <= m. Nếu m bị bỏ qua, nó tương đương như ∞

"candy", 2 kí tự 'a' đầu tiên trong

"caandy", và 3 kí tự 'a' đầu tiên trong "caaaaaaandy". Lưu ý là

"caaaaaaandy" chỉ khớp với 3 kí tự 'a' đầu tiên mặc dù chuỗi đó chứa 7 kí tự 'a'

[xyz] Lớp kí tự. Loại mẫu này dùng để so khớp với một kí tự bất kì trong dấu ngoặc vuông, bao gồm cả escape sequences. Trong lớp kí tự, dấu chấm (.) và dấu hoa thị (*) không còn là kí tự đặc biệt nên ta không cần kí tự thoát đứng trước nó. Ta có thể chỉ định một khoảng kí tự bằng cách sử dụng một kí tự gạch nối (-)

[a-d] so khớp tương tự như mẫu [abcd], khớp với 'b' trong

"brisket" và 'c' trong "city". Mẫu /[a-z.]+/ và /[\w.]+/ khớp với toàn chuỗi "test.i.ng"

[^xyz] Lớp kí tự phủ định. Khi kí tự ^ đứng đầu tiên trong dấu ngoặc vuông, nó phủ định mẫu này

[^abc] tương tự như [^a-c], khớp với 'r' trong "brisket" và 'h' trong

"chop" là kí tự đầu tiên không thuộc khoảng a đến c

[\b] Khớp với kí tự biên. Kí tự biên là một kí tự giả, nó khớp với vị trí mà một kí tự không được theo sau hoặc đứng trước bởi một kí tự khác. Tương đương với mẫu (^\w|\w$|\W\w|\w\W)

- /\bm/ khớp với 'm' trong chuỗi

"moon"

- /oo\b/ không khớp 'oo' trong chuỗi "moon", bởi vì 'oo' được theo sau bởi kí tự 'n'

- /oon\b/ khớp với 'oon' trong chuỗi "moon", bởi vì 'oon' ở cuối chuỗi nên nó không được theo sau bởi một kí tự

- /\w\b\w/ sẽ không khớp với bất kì thứ gì, bởi vì một kí tự không thể theo sau một kí tự biên và một kí tự thường.

\B Khớp với kí tự không phải kí tự biên.

Mẫu này khớp tại vị trí mà kí tự trước và kí tự sau nó cùng kiểu: hoặc cả hai là kí tự hoặc cả hai không phải là kí tự.

Bắt đầu và kết thúc chuỗi không được xem là những kí tự

/\B../ khớp với 'oo' trong

"noonday", và /y\B./ khớp với 'ye' trong "possibly yesterday."

\cX X là một kí tự trong khoảng A tới Z.

Mẫu này khớp với một kí tự điều khiển trong một chuỗi

/\cM/ khớp với control-M (U+000D) trong chuỗi

\d Khớp với một kí tự số. Tương đương với mẫu [0-9]

/\d/ hoặc /[0-9]/ khớp với '2' trong chuỗi "B2 is the suite number."

\D Khớp với một kí tự không phải là kí tự số. Tương đương với mẫu [^0-9]

/\D/ hoặc /[^0-9]/ khớp với 'B' trong "B2 is the suite number."

\w Khớp với tất cả kí tự là chữ, số và gạch dưới. Tương đương với mẫu [A-Za-z0- 9_]

/\w/ khớp với 'a' trong "apple," '5' trong "$5.28," và '3' trong "3D.

\W Khớp với tất cả kí tự không phải là chữ.

Tương đương với mẫu [^A-Za-z0-9_]

/\W/ hoặc /[^A-Za-z0-9_]/ khớp với '%' trong "50%."

Một phần của tài liệu Ứng dụng máy vectơ hỗ trợ phân loại ý kiến của người xem trên các trang web phim trực tuyến (Trang 24 - 28)

Tải bản đầy đủ (PDF)

(87 trang)