Mar 15, 2012

Regex on linux - part 1

Sức mạnh của biểu thức chính quy trong Linux (Phần 1)


Câu hỏi: Điều gì làm nên sức mạnh xử lý text trong Unix/Linux?

Trong quá trình học tập và sử dụng, cá nhân tôi thấy lý do của việc này chính là khả năng *NIX cho phép người dùng thao tác trực tiếp với biểu thức chính quy. Nói như vậy không có nghĩa là Windows không dùng, mà đó là họ triển khai sẵn các mẫu và không nói cho người dùng biết về khả năng của Regex.

Regular Expression, thường viết tắt là regex hay regexp, là một khái niệm không phải cao siêu đối với những người học công nghệ thông tin. Điều đó là tất yếu, bởi vì bạn học IT, bạn phải học toán rời rạc, đôi khi là cả chương trình dịch, mà những môn đó bắt buộc phải học tới Ôtômat và Biểu thức chính quy. Càng đi sâu vào khai thác và sử dụng, bạn mới thấy nó mạnh và không đơn giản như mình tưởng :D

Biểu thức chính quy mang đến khả năng tìm kiếm xâu ký tự mạnh mẽ cho bất cứ công cụ xử lý text nào, trong *NIX bạn sẽ không có được sự mạnh mẽ của các filter như GREP, EGREP, hay các editor khác nếu bạn không làm chủ được Regex. Vậy tóm lại, có thể hiểu thô thiển, đó là một chuỗi ký tự đặc biệt giúp xây dựng nên các mẫu tìm kiếm ( searching partern).

Phần 1: Một số tóm tắt cơ bản về biểu thức chính quy:





























































































Ký tựMô tảVí dụ
Tất cả, ngoại trừ
[\^$.|?*+()
là các hằng ký tự, không có nghĩa đặc biệt, cặp {} cũng là hằng ký tự, trừ khi nó nằm trong token có nghĩa, ví dụ {n}
\ theo sau là [\^$.|?*+(){}mang nghĩa escape, tức là làm cho các ký tự phía sau trở thành hằng ký tự, không còn tính đặc biệt\+ khớp cho +
\$ khớp cho $
\Q...\Ekhớp tất cả các ký tự nằm giữa cặp \Q và \E kèm theo việc escape chúng\Q+-*/\E sẽ khớp cho xâu +-*/
\n, \r, \tkhớp với các ký tự CR, LF và tab\r\n ứng với ký tự ngắt dòng trong MS-Windows: CRLF
\cA đến \cZkhớp với cụm ký tự ctrl-A đến ctrl-Z
Có thể dùng được với miền ký tự
\cM\cJ khớp với ký tự ngắt dòng CRLF của Windows
/xFF (với FF là 2 chữ số hệ cơ số 16 hexa)khớp với ký tự ở dạng ASCII/ANSI
[mở đầu một miền ký tự[abc]
Tất cả, ngoại trừ ]^-\nội dung trường ký tự cần khớp[cuong] khớp với c, u, o, n hoặc g
-
ngoại trừ trường hợp đứng ngay sau [
chỉ ra trường giá trị[a-zA-Z] khớp từ a đến z, A đến Z
^ đứng ngay sau [phủ định trường giá trị[^a-z] khớp tất cả ngoại trừ a đến z
\d, \w, \sviết gọn của dạng ký tự chữ số (digit);
từ (word: bao gồm chữ số, chữ cái, dấu gạch dưới)
khoảng trắng (space: bao gồm dấu cách, tab và xuống dòng)
[\d\s] khớp với ký tự là chữ số hoặc khoảng trắng
\D, \W, \Sngược lại bên trên[\d] khớp với ký tự không phải chữ số
. (dấu chấm)khớp bất kỳ ký tự đơn, ngoại trừ ngắt dòng \r, \n
^ (dấu mũ)báo hiệu khớp từ vị trí đầu tiên của 1 xâu, chỉ mang tính báo hiệu, không đại diện cho ký tự nào^. khớp a trong xâu abc
^c. khớp các xâu bắt đầu bởi c
$ (dấu đôla)báo hiệu khớp tới vị trí cuối của xâu, chỉ mang tính báo hiệu, không đại diện cho ký tự nào^. khớp c trong xâu cuong
*b$ khớp với các xâu kết thúc bởi ký tự b
\Akhớp bắt đầu vị trí đầu tiên của xâu, chỉ mang tính chất báo hiệu vị trí, không khớp sau khi gặp dấu xuống dòng\A. sẽ khớp a trong xâu abc\n
\Zkhớp vị trí cuối xâu, chỉ mang tính báo hiệu vị trí. Chỉ khớp sau dấu xuống dòng, bỏ qua dòng cuối cùng nếu mỗi dòng kết thúc bởi dấu xuống dòng.\Z sẽ khớp g trong xâu Pham\nCuong

-- Còn tiếp --

1 comment: