Biểu thức chính quy (có ví dụ) - 1

"Và bây giờ tôi sẽ nói với bạn về các biểu thức chính quy. Chủ đề này vừa phức tạp vừa đơn giản. Để hiểu thấu đáo các biểu thức chính quy, bạn có thể cần đọc hai hoặc ba cuốn sách dày cộp, nhưng tôi có thể dạy bạn cách sử dụng chúng ngay lập tức."

"Là những lập trình viên có kinh nghiệm thích nói đùa, nếu bạn gặp một vấn đề và nghĩ rằng bạn sẽ giải quyết nó bằng các biểu thức chính quy, thì bây giờ bạn có hai vấn đề."

"Hừm."

"Tôi hy vọng tôi đã không làm bạn sợ quá nhiều, bạn của tôi. Không?"

"Được rồi, tốt. Vì vậy, chủ đề mới của chúng ta là biểu thức chính quy."

"Nếu chúng ta đơn giản hóa chúng quá mức, các biểu thức chính quy sẽ là các mẫu cho các chuỗi."

"Bạn có thể kiểm tra xem một chuỗi có khớp với một mẫu nhất định hay không. Bạn cũng có thể chia một chuỗi thành các phần bằng dấu phân cách hoặc một mẫu."

"Nhưng hãy bắt đầu với một điều đơn giản: mẫu là gì? "

"Trong SQL (nhưng không phải trong Java), bạn có thể kiểm tra xem một chuỗi có khớp với một mẫu cụ thể hay không. Nó trông như thế này:"

name like 'Alex%'

Ở đây tên là một biến, giống như một lệnh để kiểm tra một mẫu và "Alex%" là mẫu.

Trong trường hợp này, % có nghĩa là bất kỳ chuỗi hoặc chuỗi con nào.

Mẫu Dây phù hợp với mẫu
'Alex%' Alex
Alex và Alex và
Alex
Alex
….
'%x%' Ma x
Ma x im
Ale x andr
'%Một' Olg a
Helen a
Ir a

"Trong SQL, nếu bạn cần chỉ định rằng chỉ nên có một ký tự khác, thì bạn sẽ sử dụng ký tự gạch dưới: "_"."

Mẫu Dây phù hợp với mẫu
'Alex% _' Alex
Alex và Alex và
Alex
Alex
….
'_x' Ax
Bx
Cx
'___' Aaa
Aab
Bbb

"Điều đó có ý nghĩa."

"Được rồi, vậy chúng ta hãy chuyển sang biểu thức thông thường."

"Các biểu thức chính quy thường bao gồm hạn chế không chỉ về số lượng ký tự mà còn cả 'nội dung' của chúng." ."

"Dưới đây là một số ví dụ về nội dung :"

Mẫu Sự miêu tả ví dụ
. Một ký tự bất kỳ 1
\d Bất kỳ chữ số 7
Bất kỳ chữ số nào C
\S Dấu cách, ngắt dòng hoặc ký tự tab ''
\S Mọi thứ trừ dấu cách, tab và ngắt dòng f
[az] Bất kỳ chữ cái nào từ a đến z z
[0-9] Bất kỳ chữ số nào từ 0 đến 9. số 8
\w Bất kỳ ký tự từ nào c
\W Bất kỳ ký tự không phải từ nào _

"Tôi sẽ không nhớ những thứ đó ngay lập tức, nhưng nó không quá khó."

"Tuyệt vời, sau đây là ví dụ về số lượng ký tự trong mặt nạ: "

Mẫu Sự miêu tả ví dụ
MỘT? Ký tự 'A' xuất hiện một lần hoặc không xảy ra lần nào MỘT
B+ Ký tự 'B' xuất hiện một hoặc nhiều lần BBBB
C* Ký tự 'C' xuất hiện từ 0 lần trở lên CCC
Đ{n} Ký tự 'D' xuất hiện n lần Mẫu D{4} khớp với DDDD
Đ{n,} Ký tự 'E' xuất hiện n lần trở lên Mẫu E{2,} khớp với EEEEEEE
F{n,m} Ký tự 'F' xuất hiện giữa n và m lần Mẫu E{2,4} khớp với EEEE

"Tất cả điều đó có vẻ khá đơn giản."

"Bạn đang nắm bắt mọi thứ quá nhanh. Bây giờ chúng ta hãy cùng nhau xem mọi thứ trông như thế nào:"

Mẫu Sự miêu tả ví dụ
[quảng cáo]? Một ký tự giữa 'a' và 'd' xuất hiện một lần hoặc hoàn toàn không A B C D
[bd,z]+ Các ký tự 'b', 'c', 'd' hoặc 'z' xuất hiện một hoặc nhiều lần b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Các chữ số 1, 7, 8 hoặc 9 không xuất hiện hoặc nhiều lần 1, 7, 9, 9777, 111199
1{5} Chữ số 1 xuất hiện 5 lần 11111
[1,2,a,b]{2} Các ký hiệu 1, 2, 'a' hoặc 'b' xuất hiện hai lần 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Các ký hiệu 'a' hoặc 0 xuất hiện 2 hoặc 3 lần aa, a0,00,0a, aa,000, a00,0a0, a0a

"Vẫn rõ ràng."

"Thật sao? Hừm. Hoặc là tôi đã giải thích mọi thứ thật cặn kẽ hoặc là anh tiếp thu quá nhanh. Dù sao thì điều đó cũng tốt cho chúng ta."

"Đây là một vài hiểu biết mới cho bạn."

"Vì các biểu thức chính quy thường được sử dụng để tìm các chuỗi con, nên chúng tôi có thể thêm hai ký tự nữa (^ và $) vào các mẫu của mình."

"^ có nghĩa là chuỗi con phải bao gồm phần đầu của chuỗi."

"$ có nghĩa là chuỗi con phải bao gồm phần cuối của chuỗi."

"Đây là một số ví dụ:"

Mẫu Chuỗi và chuỗi con phù hợp với mẫu
một{3} aa a  a  a a  a a  a
một{3}$ aa a a a a a a  a
^a{3} aa a  a a a a a a
^a{3}$ aa a a a a a a a

"Và một điểm quan trọng nữa."

"Trong biểu thức chính quy, các ký tự sau có ý nghĩa đặc biệt: [ ] \ / ^ $ . | ? * + ( ) { }. Chúng được gọi là ký tự điều khiển. Vì vậy, bạn không thể đơn giản sử dụng chúng trong chuỗi."

"Như trong mã Java, chúng phải được thoát. "Và một lần nữa như trong mã Java, ký tự '\' được sử dụng cho việc này."

"Nếu chúng ta muốn mô tả một chuỗi bao gồm ba '?' ký tự, chúng tôi không thể viết '?{3}', bởi vì '?' là ký tự điều khiển. Chúng ta cần thực hiện như sau: \?{3}. Nếu chúng ta muốn sử dụng ký tự '\', thì chúng ta cần viết '\\'."

"OK đã nhận nó."

"Và bây giờ đây là một mẩu tin thú vị khác. Trong các tệp có mã Java, ký tự '\' cũng phải được thoát trong chuỗi, vì đó là ký tự điều khiển."

"Tất nhiên rồi."

"Vì vậy, nếu bạn đang cố gắng xác định một biểu thức chính quy Java trong một chuỗi, thì bạn cần thoát khỏi ký tự '\' hai lần."

"Đây là một ví dụ:"

Tôi muốn một mặt nạ phù hợp với 'c:\anything'
Về lý thuyết, biểu thức chính quy sẽ giống như sau:
một ký tự 'c',
dấu hai chấm,
dấu gạch chéo ngược,
dấu chấm và dấu hoa thị (để biểu thị bất kỳ số lượng ký tự nào). Tôi đã thêm dấu cách để cải thiện khả năng đọc:
c : \ .*
Nhưng các ký tự '\' và '.' cần được thoát, vì vậy biểu thức chính quy sẽ giống như sau:
c :   \\ \. *
Hoặc, không có dấu cách
c: \\ \. *
"Chúng ta nên có ba dấu gạch chéo ngược trong biểu thức chính quy của mình.
Điều đó có nghĩa là trong một tệp Java, biểu thức chính quy sẽ trông như thế này:"
String regexp = "c: \\\\ \\. *";

"Chà! Chà. Giờ tôi mới biết."

"Và nếu bạn quyết định tìm hiểu sâu hơn về vấn đề này, đây là một vài liên kết tốt:"

Bài học trên Wikipedia