Sunday, 16/12/2018
News
Home » Tutorial - Series » Perl Tutorial » [Perl] Bài 3 – Tìm hiểu sâu hơn về so sánh

[Perl] Bài 3 – Tìm hiểu sâu hơn về so sánh

SimpleMatching
Các biểu thức thông thường đơn giản được kết hợp biểu thức.Người lập trình thực hiện các kiểm tra bằng cách sử dụng các từ khóa như if , while và unless . Hoặc kết hợp sử dụng với and và or . Một biểu thức chính quy phù hợp sẽ trả về giá trị true điều bạn muốn thực thi là đúng. Khi bạn muốn sử dụng một regular expressio để phù hợp với một chuỗi, bạn sử dụng toán tử đặc biệt =~

Chú ý cú pháp của biểu thức chính quy: một chuỗi trong một cặp dấu gạch chéo. Mã $user_location =~ /thirteen/ hỏi liệu các chuỗi chữ thirteen xảy ra bất cứ nơi nào bên trong $user_location . Nếu có, trả về true, nếu không, trả về false.

Metacharacters
Một siêu ký tự là một ký tự hoặc chuỗi ký tự có ý nghĩa đặc biệt. Chúng ta đã thảo luận metacharacters trong bối cảnh hai trích dẫn chuỗi, nơi mà các chuỗi \n có nghĩa là các ký tự xuống dòng, không phải là một dấu gạch chéo ngược, và ký tự n và \t có nghĩa là các ký tự tab.

Biểu thức thông thường có một vốn từ vựng phong phú của metacharacters cho phép bạn đặt câu hỏi thú vị như, “Có biểu hiện này xảy ra ở cuối chuỗi” Hoặc “Chuỗi này chứa một loạt các con số!?”

Hai metacharacters đơn giản nhất là ^ và $ . Chúng có ý nghĩa là “đầu chuỗi” và “cuối chuỗi” tương ứng. Ví dụ, biểu thức chính quy /^Bob/ sẽ phù hợp với “Bob đã ở đây”, “Bob” và “Bobby.” Nó sẽ không phù hợp với “Đó là Bob và David”, bởi vì Bob không hiển thị ở đầu của chuỗi. Các ký tự $ , mặt khác, có nghĩa là kết thúc của một chuỗi. Regexp /David$/ sẽ phù hợp với “Bob và David”, nhưng không phù hợp với “David và Bob” .Đây là một ví dụ đơn giản mà sẽ đưa dòng từ một tập tin và chỉ in URL HTML.:

Một tập hữu ích của metacharacters được gọi là ký tự đại diện. Nếu bạn đã từng sử dụng một shell Unix hoặc Windows DOS, bạn đã quen thuộc với các kí hiệu nhân vật như * và ? . Ví dụ khi bạn gõ ls a*.txt , bạn sẽ thấy tất cả các tên tập tin bắt đầu bằng chữ cái a và kết thúc bằng .txt . Perl là phức tạp hơn một chút, nhưng hoạt động trên nguyên tắc chung giống nhau.

Trong Perl, các ký tự đại diện chung là “.” . Một thời điểm bên trong một biểu hiện thường xuyên sẽ phù hợp với bất kỳ ký tự nào, ngoại trừ một dòng mới. Ví dụ, biểu thức chính quy /ab/ sẽ phù hợp với bất cứ điều gì có chứa a , một ký tự đó không phải là một dòng mới, tiếp theo là b – ” aab”, “A3B”, “ab”, và vv.

Nếu bạn muốn theo nghĩa đen phù hợp với một siêu ký tự, bạn phải thoát khỏi nó với một dấu gạch chéo ngược. Regex /Mr./ phù hợp với bất cứ điều gì có chứa “Mr.” tiếp theo ký tự khác. Nếu bạn chỉ muốn để phù hợp với một chuỗi thực sự có “Mr.” bạn phải sử dụng /Mr\./ .

Các . siêu ký tự không phải là rất hữu ích, đó là lý do Perl cung cấp ba lượng hóa ký tự đại diện: + , ? và * . Mỗi lượng hóa có nghĩa là một cái gì đó khác nhau.

Các + lượng hóa là dễ hiểu: Nó có nghĩa là để phù hợp với ký tự ngay trước hoặc siêu ký tự một hoặc nhiều lần. Các biểu hiện thường xuyên /ab+c/ sẽ phù hợp với “abc”, “abbc”, “abbbc” và tương tự.

Các * lượng hóa phù hợp với ký tự ngay trước hoặc siêu ký tự không hoặc nhiều lần. Điều này là khác nhau từ + lượng hóa! /ab*c/ sẽ phù hợp với “abc”, “abbc’,’ và tương tự, giống như /ab+c/ đã làm, nhưng nó cũng sẽ phù hợp với “ac”, bởi vì có không xuất hiện của b trong chuỗi.

Cuối cùng, ? lượng hóa sẽ phù hợp với ký tự trước đó không hoặc một lần. Regex /ab?c/ sẽ phù hợp với “ac” (không xuất hiện của b ) và “abc” (xuất hiện của b ). Nó sẽ không phù hợp với “abbc”, “abbbc” và tương tự.

Chúng ta có thể viết lại code đọc URL-phù hợp với chúng ta để ví dụ sử dụng các metacharacters. Điều này sẽ làm cho nó ngắn gọn hơn. Thay vì sử dụng hai biểu thức riêng biệt thường xuyên ( /^http:/ và /html$/ ), chúng tôi kết hợp chúng thành một biểu thức chính quy: /^http:.+html$/ . Để hiểu điều này không, đọc từ trái sang phải: regex này sẽ phù hợp với bất kỳ chuỗi bắt đầu với “http:” theo sau bởi một hoặc nhiều lần xuất hiện của bất kỳ ký tự nào và kết thúc với “html”. Bây giờ, RegExp của chúng ta là:

Nhớ là biểu thức /^something$/ này rất hữu dụng
Character classes
Chúng tôi đã thảo luận về một siêu ký tự đặc biệt, . , phù hợp với bất kỳ ký tự ngoại trừ một dòng mới. Nhưng bạn sẽ thường muốn để phù hợp với chỉ các loại cụ thể của ký tự. Perl cung cấp một số metacharacters cho việc này. <\ D> sẽ phù hợp với một chữ số duy nhất, \w sẽ phù hợp với bất kỳ “từ” , và \s phù hợp với một ký tự khoảng trắng (space và tab, như cũng như \n và \r ký tự).

Các metacharacters làm việc giống như bất kỳ ký tự khác: Bạn có thể kết hợp chống lại nó, hoặc bạn có thể sử dụng lượng hóa như + và * . Regex /^\s+/ sẽ phù hợp với bất kỳ chuỗi bắt đầu với khoảng trắng, và /\w+/ sẽ phù hợp với một chuỗi có chứa ít nhất một từ. (Nhưng hãy nhớ rằng định nghĩa của “từ” của Perl bao gồm chữ số và gạch dưới, vì vậy hay không, bạn nghĩ _ hoặc 25 là những từ, Perl không!)

Một ví dụ tốt cho \d được thử nghiệm để xem liệu chúng có chứa số. Ví dụ, bạn có thể cần phải xác minh rằng một chuỗi có chứa một số điện thoại theo phong cách Mỹ, trong đó có các hình thức 555-1212 . Bạn có thể sử dụng mã như thế này:

Tất cả những \d metacharacters làm cho regex khó đọc. May mắn thay, Perl cho phép chúng ta cải tiến về điều đó. Bạn có thể sử dụng các số bên trong dấu ngoặc nhọn để chỉ ra một số lượng bạn muốn để phù hợp , như thế này:

Chuỗi \d{3} có nghĩa là so sánh chính xác ba con số, và \d{4} phù hợp chính xác bốn chữ số. Nếu bạn muốn sử dụng một loạt các con số, bạn có thể tách chúng bằng dấu phẩy; để lại số thứ hai làm cho phạm vi mở. \d{2,5} sẽ phù hợp với 2-5 chữ số, và <\ w {3 ,}> sẽ phù hợp với một từ đó là ít nhất ba ký tự.

Bạn cũng có thể đảo ngược \d , \s và \w . metacharacters để đề cập đến bất cứ điều gì nhưng mà loại ký tự \D phù hợp nondigits; \W phù hợp với bất kỳ ký tự đó không phải là một sympol, chữ số hoặc gạch dưới, và \S phù hợp với bất cứ điều gì đó không phải là khoảng trắng.

Nếu những metacharacters sẽ không làm những gì bạn muốn, bạn có thể định nghĩa của riêng bạn. Bạn định nghĩa một lớp nhân vật bằng cách kèm theo một danh sách các ký tự cho phép trong dấu ngoặc vuông. Ví dụ, một lớp chỉ chứa các nguyên âm chữ thường là [aeiou] . /b[aeiou]g/ sẽ phù hợp với bất kỳ chuỗi có chứa “bag’,’ “beg”, “big” ,”bog” hay “bug”.. Bạn sử dụng dấu gạch ngang để chỉ ra một loạt các nhân vật, giống như [af] . (Nếu Perl không cho chúng ta dùng siêu ký tự \d , chúng ta có thể làm điều tương tự với [0-9] .) Bạn có thể kết hợp các lớp nhân vật với lượng hóa:

Bạn cũng có thể đảo ngược các lớp nhân vật bằng cách bắt đầu chúng với ký tự ^. Một lớp nhân vật sẽ phù hợp với bất cứ điều gì ngược với bạn không liệt kê. [^aeiou] phù hợp với tất cả các nhân vật ngoại trừ các nguyên âm chữ thường. (Có, ^ cũng có thể có nghĩa là “đầu chuỗi”, vì vậy hãy cẩn thận.)
Flags
Theo mặc định, các RegEXP là trường hợp nhạy cảm (có nghĩa là, /bob/ không phù hợp với “Bob”). Bạn có thể đặt những flags sau khi một regexp để thay đổi hành vi của nó. Flags thường được sử dụng là i , mà làm cho một trận đấu trường nhạy cảm:

Chúng ta sẽ nói rõ hơn về flags sau

1 Star2 Stars3 Stars4 Stars5 Stars6 Stars7 Stars8 Stars9 Stars10 Stars (3 votes, average: 6.67 out of 10)
Loading...

3 comments

  1. This intiamrfoon is off the hizool!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

:cuoi: :hix: :hihihi: :kiss: :sexy: :dotay: :ngacnhien: :oh: :love: more »