Các kí tự đặc biệt trong khuôn mẫu

Một phần của tài liệu giáo trình ngôn ngữ lập trình perl (Trang 66 - 71)

2.1 Kí tự +

Với nghĩa “một hay nhiều kí tự trước đó”. Kiểu như khuôn mẫu /hi+!/ đối sánh với bất kì xâu nào dưới đây :

hi! hii! hiii! ...

Chú ý : Khuôn mẫu /an/ đối sánh với ann, annc, annn, ... (không đối sánh với an, vì đằng sau phải có thêm kí tự nữa).

Toán tử này đặc biệt hữu dụng khi ta muốn phân tách các từ của một xâu mà có nhiều khoảng trắng(dấu cách) (chỉ có dấu cách):

$wordcount = 0; $line = <STDIN>;

while ($line ne"") { chop ($line);

@words = split(/ +/, $line); $wordcount += @words; $line = <STDIN>; }

print ("So tu duoc go la : $wordcount\n");

Lệnh @words = split(/ +/, $line) sẽ chia nhỏ xâu thành các xâu con được ngăn cách nhau bởi một hay nhiều dấu cách trong biến $line và gán vào mảng @word. Như vậy chương trình sẽ in ra số từ ta gõ vào.

Kí tự [] cho phép bạn định nghĩa khuôn mẫu mà đối sánh với một trong các kí tự trong danh sách nằm giữa hai dấu ngoặc vuông.

Ví dụ

/[Bb]a/ đối sánh với khuôn mẫu Ba hoặc ba. /[\t ]/ đối sánh với dấu tab hoặc dấu cách. @words = split(/ [\t ]+/, $line);

phân chia $line thành các từ rồi gán vào trong mảng @word (các từ này được cách nhau bởi một hay nhiều khoảng trắng hay dấu cách).

Nếu có thêm kí tự ^ sau dấu [ thì có nghĩa là đối sánh với bất kì kí tự nào khác những kí tự nằm trong dấu ngoặc vuông.

Ví dụ

/12[^12]89/ đối sánh với mẫu như sau :

 Bắt đầu bằng 12

 Tiếp theo sau là kí tự không phải 1 hay 2

 Cuối cùng là 89

2.3 Kí tự * và ?

Kí tự * đối sánh với 0 hoặc nhiều kí tự trước đó. Ví dụ /a*b/ đối sánh với ab, aab, aaab, ... Kí tự ? đối sánh với 0 hoặc 1 kí tự trước đó.

2.4 Biểu diễn kí tự đặc biệt trong khuôn mẫu

Khi muốn trong khuôn mẫu có kí tự, bình thường là kí tự đặc biệt của khuôn mẫu, hãy thêm vào trước kí tự đó dấu sổ chéo \. Ví dụ muốn kiểm tra sự xuất hiện của một hay nhiều kí tự * trong xâu, dùng khuôn mẫu như sau :

/\*+/

tương tự với các kí tự +, /, (, ), [, ], ...

2.5 Đối sánh với bất kì kí tự hay chữ số

Muốn đối sánh một kí tự với một chữ số ta dùng khuôn mẫu /[01223456789]/

Nhưng Perl cho phép bạn làm ngắn gọn hơn bằng cách chỉ ra điểm đầu và cuối của phạm vi đối sánh /[0-9]/ đối sánh với chữ số

/[^0-9]/ đối sánh kí tự không phải chữ số /[a-z]/ đối sánh với chữ thường

2.6 Khuôn mẫu mỏ neo (adsbygoogle = window.adsbygoogle || []).push({});

Perl cung cấp cho ta phương thức tìm kiếm mẫu trong xâu bằng cách dùng các khuôn mẫu được gọi là khuôn mẫu mỏ neo.

2.6.1 Khuôn mẫu ^ và $

Khuôn mẫu ^ và $ dùng để đối sánh với chỉ kí tự đầu hoặc cuối của xâu. Ví dụ

/^hello/ đối sánh với các xâu có 5 kí tự hello ở đầu xâu. /bye$/ đối sánh với các xâu có 3 kí tự bye ở cuối xâu. Ta có thể dùng cả ^ và $ để đối sánh với một xâu

/^chao$/ đối sánh với xâu chao

2.6.2 Khuôn mẫu \b và \B

Khuôn mẫu \b dùng để đối sánh với mẫu được xuất hiện ở đầu từ hoặc cuối từ trong xâu :

/\babc/ đối sánh với những từ trong xâu được bắt đầu bằng abc

/abc\b/ đối sánh với những từ trong xâu được kết thúc bằng abc

/\babc\b/ đối sánh với từ abc trong xâu Ví dụ

if ($line =~ /\bPerl\b/) {

print “Co tu Perl trong xau”; }

else print “Khong co tu Perl trong xau”;

Khuôn mẫu \B thì ngựơc lại với khuôn mẫu \b, nó đối sánh với khuôn mẫu được chứa trong từ. /\Babc/ đối sánh với những từ trong xâu có abc như xyzabc, nhưng không đối sánh với abc

/\Babc\B/ đối sánh với xabcy, nhưng không đối sánh với abc, abcdef, xyzabc

2.7 Biến trong khuôn mẫu

Nếu muốn ta có thể sử dụng biến trong khuôn mẫu. Ví dụ $mau = "[\\t ]+";

@words = split(/$mau/, $line);

2.8 Lớp kí tự được định nghĩa sẵn

Dãy mã Giải thích Khoảng

\d Bất kì chữ số nào [0-9]

\D Ngược với \d [^0-9]

\w Bất kì kí tự, chữ số , dấu _ [_0-9a-zA-Z]

\W Ngược với \w [^_0-9a-zA-Z]

\s Những khoảng trắng [ \r\t\n\f]

\S Không phải các khoảng trắng [^ \r\t\n\f]

2.9 Kí kự dấu chấm câu “.”

Kí tự này đối sánh với một kí tự bất kì ngoại trừ kí tự xuống dòng mới \n. Thường được sử dụng với kí tự *.

/1.*3/

khuôn mẫu này đối sánh với bất kì xâu nào có chứa kí tự 1 đứng trước kí tự 3. (adsbygoogle = window.adsbygoogle || []).push({});

Ví dụ nếu ta có xâu 123, 1023 thì xâu được đối sánh. Với xâu 123453 khuôn mẫu đối sánh là

123453 chứ không phải là 123 (vì tổ hợp kí tự *. sẽ cố tìm một khuôn mẫu đối sánh với nhiều kí tự nhất).

2.10 Xác định số lượng kí tự

Muốn xác định rõ số lượng kí tự trong khuôn mẫu, ta dùng khuôn mẫu /ab{2}c/

khuôn mẫu này chỉ định số lượng kí tự b sau kí tự a là 2, có nghĩa là đối sánh với khuôn mẫu abbc

Ta có thể xác định khoảng số lượng kí tự dùng dấu “,” trong { và }

/ab{2,4}c/ số lượng kí tự b là từ 2 đến 4, tức là đối sánh với khuôn mẫu abbc, hay abbbc, hay

abbbbc

/ab{2,}c/ số lượng kí tự b ít nhất là 2

/ab{0,2}c/ số lượng kí tự b nhiều nhất là 2, hay đối sánh với khuôn mẫu ac, hay abc hay abbc

/[0-9]{1,2}/ đối sánh với 1 hoặc 2 chữ số

2.11 Kí tự | (thay phiên)

Kí tự này chỉ định rõ hai hay nhiều hơn mẫu trong khuôn mẫu để mà lựa chọn /abc|def/ khuôn mẫu này đối sánh với abc hoặ def

/[a-z]|[0-9]/ khuôn mẫu này đối sánh với hoặ là một chữ cái thường, hoặc là một chữ số

Khi cho một khuôn mẫu nằm giữa hai dấu ngoặc (ab), Perl tự động ghi nhớ lại khuôn mẫu đó. Muốn lấy lại khuôn mẫu đó ta dùng kí tự \n (n ở đây là vị trí của kuôn mẫu được ghi nhớ).

Ví dụ

/(ab)c\1/ khuôn mẫu này tương đương với khuôn mẫu /abcab/

/(ab)c(9)\1ef\2\1/ khuôn mẫu này tương đương với khuôn mẫu /abc9abef9ab/

2.13 Biến chỉ đọc đặc biệt

Sau khi đối sánh khuôn mẫu thành công, các biến $1, $2, $3 vân vân sẽ được đặt cho cùng giá trị là \1, \2, \3 vân vân. Bạn có thể dùng điều này để nhìn vào một phần của việc đối sánh trong đoạn chương trình sau. Chẳng hạn:

$_ = “đây là phép kiểm tra”;

/(\W+)\W+(\W+)/; # đối sánh hai từ đầu # $1 bây giờ là “đây” còn $2 bây giờ là “là”

Bạn cũng có thể thu được cùng các giá trị ($1, $2, $3 vân vân) bằng việc đặt đối sánh trong hoàn cảnh mảng. Kết quả là một danh sách các giá trị mà sẽ được đặt cho $1 cho tới số các vật được ghi nhớ, nhưng chỉ nếu biểu thức chính qui sánh đúng. Ta hãy lấy lại thí dụ trước theo cách khác

$_ = “đây là phép kiểm tra”;

($first, $second) = /(\W+)\W+(\W+)/; # đối sánh hai từ đầu # $first bây giờ là “đây” còn $second bây giờ là “là” Lưu ý rằng các biến $1 và $2 vẫn không bị thay đổi.

Các biến chỉ đọc được xác định trước còn bao gồm $&, mà là một phần của xâu sánh đúng với biểu thức chính qui; $`, là một phần của xâu trước phần sánh đúng; còn $’ là phần của xâu sau phần sánh đúng. Chẳng hạn:

$_ = “đây là xâu mẫu”;

/xâ.*u/; # sánh “xâu” bên trong xâu # $` bây giờ là “đây là”

# $& bây giờ là “xâu” # $’ bây giờ là “mẫu”

Vì tất cả những biến này đều được đặt lại cho từng lần sánh thành công cho nên bạn nên cất giữ các giá trị trong các biến vô hướng khác nếu bạn cần các giá trị đó về sau trong chương trình. (adsbygoogle = window.adsbygoogle || []).push({});

2.14 Thứ tự ưu tiên của các kí tự đặc biệt

Cũng giống như phép toán, các kí tự đặc biệt trong khuôn mẫu cũng có thứ tự ưu tiên, kí tự nào có thứ tự ưu tiên cao hơn thì được thực hiện trước. Bảng sau đây liệt kê thứ tự ưu tiên của các kí tự đặc biệt trong khuôn mẫu:

Kí tự Giải thích

+ * ? {} Số kí tự bội

^ $ \b \B Khuôn mẫu mỏ neo

| Thay phiên

2.15 Kí tự đặc biệt chỉ định danh giới khuôn mẫu

Bình thường tất cả các khuôn mẫu được định nghĩa giữa hai dấu / . Vì thế muốn có kí tự / trong khuôn mẫu ta phải dùng \/. Nhưng như thế tật là bất tiện nếu ta muốn tìm thư mục như /user/perl/bin

/\/user\/perl\/bin/

Để làm đơn giản hơn Perl cho phép ta làm như sau m!/user/perl/bin!

Lúc này m được hiểu như là toán tử chỉ định danh giới khuôn mẫu thay cho hai dấu /

Khuôn mẫu lúc này được bao quanh bởi hai dấu !. Tương tự ta có thể chỉ định kí tự khác làm danh giới khuôn mẫu nhưng nhất thiết phải có kí tự m đứng trước.

Một phần của tài liệu giáo trình ngôn ngữ lập trình perl (Trang 66 - 71)