Biểu thức chính quy
Sửa đổi lần cuối: Thứ bảy ngày 26 tháng 1 10:09:07 2019
Mục lục
- Biểu thức chính quy là gì?
- Cấu trúc của một biểu thức chính quy
- Các ký tự neo: ^ và $
- Kết hợp một nhân vật với một bộ ký tự
- Phù hợp với bất kỳ nhân vật với.
- Chỉ định Phạm vi Nhân vật bằng [...]
- Ngoại lệ trong một bộ ký tự
- Lặp lại bộ ký tự với *
- Khớp một số bộ cụ thể với \ {và \}
- Kết hợp các từ với \ <và \>
- Backreferences - Ghi nhớ các mẫu với \ (, \) và \ 1
- Vấn đề tiềm ẩn
- Biểu thức chính quy mở rộng
- Bộ ký tự POSIX
- Phần mở rộng Perl
- Cảm ơn
Biểu thức chính quy và Kết hợp mẫu mở rộng
Bruce Barnett
Lưu ý rằng điều này đã được viết vào năm 1991, trước Linux. Vào những năm 1980, người ta thường có các bộ tính năng biểu thức chính quy khác nhau với các tính năng khác nhau. ed (1) khác với sed (1) khác với vi (1), v.v ... Lưu ý rằng Sun đã đi qua mọi tiện ích và buộc mỗi người sử dụng một trong hai thư viện biểu thức chính quy riêng biệt - thông thường hoặc mở rộng. Tôi đã viết hướng dẫn này cho người dùng Sun và một số lệnh được thảo luận hiện đã lỗi thời. Trên Linux và các hệ thống UNIX khác, bạn có thể thấy rằng một số tính năng này không được triển khai. Số dặm của bạn có thể thay đổi.
Bản quyền © 1991 Bruce Barnett & General Electric Company
Bản quyền © 2001, 2008, 2013 Bruce Barnett Bảo lưu mọi quyền
Phiên bản gốc được viết vào năm 1994 và được xuất bản trên tờ Sun Observer
Biểu thức chính quy là gì?
Biểu thức chính quy là một tập hợp các ký tự chỉ định một mẫu. Thuật ngữ "thường xuyên" không liên quan gì đến chế độ ăn giàu chất xơ. Nó xuất phát từ một thuật ngữ được sử dụng để mô tả ngữ pháp và ngôn ngữ chính thức.
Biểu thức thông thường được sử dụng khi bạn muốn tìm kiếm chỉ định các dòng văn bản có chứa một mẫu cụ thể. Hầu hết các tiện ích UNIX hoạt động trên các tệp ASCII tại một thời điểm. Biểu thức chính quy tìm kiếm các mẫu trên một dòng và không tìm các mẫu bắt đầu trên một dòng và kết thúc trên một dòng khác.
Thật đơn giản để tìm kiếm một từ hoặc chuỗi ký tự cụ thể. Hầu như mọi biên tập viên trên mọi hệ thống máy tính đều có thể làm điều này. Biểu thức thông thường là mạnh mẽ và linh hoạt hơn. Bạn có thể tìm kiếm các từ có kích thước nhất định. Bạn có thể tìm kiếm một từ có bốn nguyên âm trở lên kết thúc bằng "s". Số, ký tự dấu chấm câu, bạn đặt tên cho nó, một biểu thức thông thường có thể tìm thấy nó. Điều gì xảy ra một khi chương trình bạn đang sử dụng tìm thấy nó là một vấn đề khác. Một số chỉ tìm kiếm các mẫu. Những người khác in ra dòng chứa mẫu. Người chỉnh sửa có thể thay thế chuỗi bằng một mẫu mới. Tất cả phụ thuộc vào tiện ích.
Các biểu thức thông thường gây nhầm lẫn cho mọi người vì chúng trông rất giống các tệp khớp với mẫu mà shell sử dụng. Họ thậm chí hành động theo cùng một cách - gần như. Các lậu vuông là tương tự, và dấu hoa thị hoạt động tương tự, nhưng không giống với dấu hoa thị trong một biểu thức thông thường. Cụ thể, shell Bourne, shell C, find và cpio sử dụng các mẫu khớp tên tệp và không phải là biểu thức chính quy.
Hãy nhớ rằng các ký tự meta shell được mở rộng trước khi shell chuyển các đối số cho chương trình. Để ngăn chặn sự mở rộng này, các ký tự đặc biệt trong biểu thức chính quy phải được trích dẫn khi được chuyển dưới dạng tùy chọn từ trình bao. Bạn đã biết làm thế nào để làm điều này bởi vì tôi đã đề cập đến chủ đề này trong hướng dẫn tháng trước.
Cấu trúc của một biểu thức chính quy
Có ba phần quan trọng đối với một biểu thức chính quy. Các neo được sử dụng để xác định vị trí của mẫu liên quan đến một dòng văn bản. Bộ ký tự khớp với một hoặc nhiều ký tự ở một vị trí. Công cụ sửa đổi xác định số lần bộ ký tự trước được lặp lại. Một ví dụ đơn giản thể hiện cả ba phần là biểu thức chính quy "^ # *". Mũi tên lên là một mỏ neo chỉ ra điểm bắt đầu của dòng. Ký tự "#" là một bộ ký tự đơn giản khớp với ký tự đơn "#". Dấu hoa thị là một sửa đổi. Trong một biểu thức chính quy, nó xác định rằng bộ ký tự trước đó có thể xuất hiện bất kỳ số lần nào, kể cả số không. Đây là một biểu thức chính quy vô dụng, như bạn sẽ thấy ngay.
Ngoài ra còn có hai loại biểu thức chính quy: biểu thức chính quy "Cơ bản" và biểu thức chính quy "mở rộng". Một vài tiện ích như awk và egrep sử dụng biểu thức mở rộng. Hầu hết sử dụng biểu thức chính quy "thông thường". Từ giờ trở đi, nếu tôi nói về một "biểu thức chính quy", thì nó mô tả một tính năng trong cả hai loại.
Dưới đây là bảng các lệnh Solaris (khoảng năm 1991) cho phép bạn chỉ định các biểu thức chính quy:
| Tiện ích | Loại biểu thức chính quy |
| vi | Căn bản |
| quyến rũ | Căn bản |
| grep | Căn bản |
| csplit | Căn bản |
| dbx | Căn bản |
| dbxtool | Căn bản |
| hơn | Căn bản |
| ed | Căn bản |
| expr | Căn bản |
| lex | Căn bản |
| pg | Căn bản |
| nl | Căn bản |
| người thứ ba | Căn bản |
| ôi | Mở rộng |
| chim ưng | Mở rộng |
| egrep | Mở rộng |
| EMACS | Biểu thức thường xuyên EMACS |
| PERL | Biểu thức thường xuyên PERL |
Các ký tự neo: ^ và $
Hầu hết các cơ sở văn bản UNIX được định hướng dòng. Tìm kiếm các mẫu trải dài trên một số dòng là không dễ thực hiện. Bạn thấy, kết thúc của ký tự dòng không được bao gồm trong khối văn bản được tìm kiếm. Nó là một dải phân cách. Biểu thức chính quy kiểm tra văn bản giữa các dấu phân cách. Nếu bạn muốn tìm kiếm một mẫu ở đầu này hay đầu kia, bạn sử dụng các neo. Ký tự "^" là neo bắt đầu và ký tự "$" là neo cuối. Biểu thức chính quy "^ A" sẽ khớp với tất cả các dòng bắt đầu bằng chữ A. Biểu thức "A $" sẽ khớp với tất cả các dòng kết thúc bằng chữ A. Nếu các ký tự neo không được sử dụng ở cuối mẫu thích hợp, sau đó họ không còn đóng vai trò là mỏ neo. Đó là, "^" chỉ là một mỏ neo nếu nó là ký tự đầu tiên trong biểu thức chính quy. "$" Chỉ là một mỏ neo nếu nó là ký tự cuối cùng. Biểu thức "$ 1" không có neo. Không phải là "1 ^". Nếu bạn cần khớp "^" ở đầu dòng hoặc "$" ở cuối dòng, bạn phải thoát các ký tự đặc biệt bằng dấu gạch chéo ngược. Đây là một bản tóm tắt:
| Mẫu | Kết quả phù hợp |
| ^ A | "A" ở đầu một dòng |
| Một đô la | "A" ở cuối dòng |
| Một ^ | "A ^" bất cứ nơi nào trên một dòng |
| $ A | "$ A" bất cứ nơi nào trên một dòng |
| ^^ | "^" ở đầu một dòng |
| $$ | "$" ở cuối dòng |
Việc sử dụng "^" và "$" làm chỉ số bắt đầu hoặc kết thúc một dòng là một quy ước sử dụng các tiện ích khác. Trình soạn thảo vi sử dụng hai ký tự này làm các lệnh để đi đến đầu hoặc cuối của một dòng. Shell C sử dụng "! ^" Để chỉ định đối số đầu tiên của dòng trước đó và "! $" Là đối số cuối cùng trên dòng trước đó.
Đó là một trong những lựa chọn mà các tiện ích khác đi cùng để duy trì tính nhất quán. Chẳng hạn, "$" có thể chỉ đến dòng cuối cùng của tệp khi sử dụng ed và sed . Cat -e đánh dấu kết thúc của dòng bằng "$". Bạn có thể thấy nó trong các chương trình khác là tốt.
Kết hợp một nhân vật với một bộ ký tự
Bộ ký tự đơn giản nhất là một ký tự. Biểu thức chính quy "the" chứa ba bộ ký tự: "t," "h" và "e". Nó sẽ khớp bất kỳ dòng nào với chuỗi "the" bên trong nó. Điều này cũng sẽ phù hợp với từ "khác". Để ngăn chặn điều này, hãy đặt khoảng trắng trước và sau mẫu: "the". Bạn có thể kết hợp chuỗi với một neo. Mẫu "^ From:" sẽ khớp với các dòng của thư xác định người gửi. Sử dụng mẫu này với grep để in mọi địa chỉ trong hộp thư đến của bạn:
- grep '^ Từ:' / usr / spool / mail / $ USER
Một số nhân vật có một ý nghĩa đặc biệt trong các biểu thức thông thường. Nếu bạn muốn tìm kiếm một nhân vật như vậy, hãy thoát khỏi nó bằng dấu gạch chéo ngược.
Phù hợp với bất kỳ nhân vật với.
Nhân vật "." là một trong những siêu nhân vật đặc biệt Chính nó sẽ phù hợp với bất kỳ nhân vật nào, ngoại trừ nhân vật cuối dòng. Mẫu sẽ khớp với một dòng với một ký tự là
- ^. $
Chỉ định Phạm vi Nhân vật bằng [...]
Nếu bạn muốn khớp các ký tự cụ thể, bạn có thể sử dụng dấu ngoặc vuông để xác định các ký tự chính xác mà bạn đang tìm kiếm. Mẫu sẽ khớp với bất kỳ dòng văn bản nào chứa chính xác một số là
- ^ [0123456789] $
Đây là dài dòng. Bạn có thể sử dụng dấu gạch nối giữa hai ký tự để chỉ định một phạm vi:
- ^ [0-9] $
Bạn có thể xen kẽ các ký tự rõ ràng với phạm vi ký tự. Mẫu này sẽ khớp với một ký tự duy nhất là một chữ cái, số hoặc dấu gạch dưới:
- [A-Za-z0-9_]
Bộ ký tự có thể được kết hợp bằng cách đặt chúng cạnh nhau. Nếu bạn muốn tìm kiếm một từ
- Bắt đầu bằng chữ in hoa "T".
- Là từ đầu tiên trên một dòng
- Bức thư thứ hai là một chữ cái viết thường
- Chính xác là ba chữ cái và
- Chữ thứ ba là một nguyên âm
biểu thức chính quy sẽ là "^ T [az] [aeiou]".
Ngoại lệ trong một bộ ký tự
Bạn có thể dễ dàng tìm kiếm tất cả các ký tự ngoại trừ các ký tự trong ngoặc vuông bằng cách đặt "^" làm ký tự đầu tiên sau "[". Để khớp tất cả các ký tự ngoại trừ nguyên âm, hãy sử dụng "[^ aeiou]".
Giống như các mỏ neo ở những nơi không thể được coi là mỏ neo, các ký tự "]" và "-" không có ý nghĩa đặc biệt nếu chúng trực tiếp theo "[". Dưới đây là một số ví dụ:
| Biểu hiện thông thường | Kết quả phù hợp |
| [] | Các nhân vật "[]" |
| [0] | Ký tự "0" |
| [0-9] | Bất kỳ số nào |
| [^ 0-9] | Bất kỳ ký tự nào ngoài một số |
| [-0-9] | Bất kỳ số hoặc một "-" |
| [0-9-] | Bất kỳ số hoặc một "-" |
| [^ -0-9] | Bất kỳ ký tự nào ngoại trừ một số hoặc dấu "-" |
| [] 0-9] | Bất kỳ số hoặc một "]" |
| [0-9]] | Bất kỳ số nào theo sau là "]" |
| [0-9-z] | Bất kỳ số nào, |
| hoặc bất kỳ ký tự nào giữa "9" và "z". | |
| [0-9 \ -a \]] | Bất kỳ số nào, hoặc |
| "-", "a" hoặc "]" |
Lặp lại bộ ký tự với *
Phần thứ ba của biểu thức chính quy là phần bổ nghĩa. Nó được sử dụng để xác định số lần bạn mong đợi để xem bộ ký tự trước đó. Ký tự đặc biệt "*" khớp với 0 hoặc nhiều bản sao. Nghĩa là, biểu thức chính quy "0 *" khớp với 0 hoặc nhiều số 0 , trong khi biểu thức "[0-9] *" khớp với số 0 hoặc nhiều số.
Điều này giải thích tại sao mẫu "^ # *" là vô dụng, vì nó khớp với bất kỳ số "#" nào ở đầu dòng, bao gồm số không . Do đó, điều này sẽ khớp với mọi dòng, bởi vì mọi dòng bắt đầu bằng 0 hoặc nhiều hơn "# 's".
Thoạt nhìn, có vẻ như bắt đầu đếm từ 0 là ngu ngốc. Không phải vậy. Tìm kiếm một số lượng nhân vật chưa biết là rất quan trọng. Giả sử bạn muốn tìm một số ở đầu một dòng và có thể có hoặc không có khoảng trắng trước số đó. Chỉ cần sử dụng "^ *" để khớp 0 hoặc nhiều khoảng trắng ở đầu dòng. Nếu bạn cần khớp một hoặc nhiều, chỉ cần lặp lại bộ ký tự. Nghĩa là, "[0-9] *" khớp với 0 hoặc nhiều số và "[0-9] [0-9] *" khớp với một hoặc nhiều số.
Khớp một số bộ cụ thể với \ {và \}
Bạn có thể tiếp tục kỹ thuật trên nếu bạn muốn chỉ định số lượng bộ ký tự tối thiểu. Bạn không thể chỉ định số lượng bộ tối đa bằng công cụ sửa đổi "*". Có một mẫu đặc biệt bạn có thể sử dụng để chỉ định số lần lặp tối thiểu và tối đa. Điều này được thực hiện bằng cách đặt hai số đó vào giữa "\ {" và "\}". Các dấu gạch chéo ngược xứng đáng được thảo luận đặc biệt. Thông thường một dấu gạch chéo ngược tắt ý nghĩa đặc biệt cho một nhân vật. Một khoảng thời gian được khớp bởi "\." và dấu hoa thị được khớp bởi "\ *".
Nếu dấu gạch chéo ngược được đặt trước "<," ">," "{," "}," "(," ")," hoặc trước một chữ số, dấu gạch chéo ngược sẽ có nghĩa đặc biệt. Điều này đã được thực hiện bởi vì các hàm đặc biệt này đã được thêm vào cuối đời trong các biểu thức chính quy. Thay đổi nghĩa của "{" sẽ phá vỡ các biểu thức cũ. Đây là một tội ác khủng khiếp bị trừng phạt bởi một năm lao động khổ sai viết các chương trình COBOL. Thay vào đó, thêm một dấu gạch chéo thêm chức năng mà không phá vỡ các chương trình cũ. Thay vì phàn nàn về sự không đối xứng, hãy xem nó như một sự tiến hóa.
Đã thuyết phục bạn rằng "\ {" không phải là một âm mưu làm bạn bối rối, một ví dụ là theo thứ tự. Biểu thức chính quy để khớp với 4, 5, 6, 7 hoặc 8 chữ in thường là
- [az] \ {4,8 \}
Bất kỳ số nào trong khoảng từ 0 đến 255 có thể được sử dụng. Số thứ hai có thể được bỏ qua, loại bỏ giới hạn trên. Nếu dấu phẩy và số thứ hai bị bỏ qua, mẫu phải được nhân đôi số lần chính xác được chỉ định bởi số thứ nhất.
Bạn phải nhớ rằng các công cụ sửa đổi như "*" và "\ {1,5 \}" chỉ đóng vai trò là công cụ sửa đổi nếu chúng tuân theo một bộ ký tự. Nếu chúng ở đầu một mẫu, chúng sẽ không phải là một sửa đổi. Dưới đây là danh sách các ví dụ và các trường hợp ngoại lệ:
| Biểu hiện thông thường | Kết quả phù hợp |
| _ | |
| * | Bất kỳ dòng nào có dấu hoa thị |
| \ * | Bất kỳ dòng nào có dấu hoa thị |
| \ | Bất kỳ dòng nào có dấu gạch chéo ngược |
| ^ * | Bất kỳ dòng nào bắt đầu bằng dấu hoa thị |
| ^ A * | Bất kỳ dòng nào |
| ^ A \ * | Bất kỳ dòng nào bắt đầu bằng "A *" |
| ^ Aa * | Bất kỳ dòng nào nếu nó bắt đầu bằng một "A" |
| ^ Aa * B | Bất kỳ dòng nào có một hoặc nhiều "A" được theo sau bởi "B" |
| ^ A \ {4,8 \} B | Bất kỳ dòng nào bắt đầu bằng 4, 5, 6, 7 hoặc 8 "A" |
| theo sau là "B" | |
| ^ A \ {4, \} B | Bất kỳ dòng nào bắt đầu bằng 4 chữ "A" trở lên |
| theo sau là "B" | |
| ^ A \ {4 \} B | Bất kỳ dòng nào bắt đầu bằng "AAAAB" |
| \ {4,8 \} | Bất kỳ dòng nào có "{4,8}" |
| Một {4,8} | Bất kỳ dòng nào có "A {4,8}" |
Kết hợp các từ với \ <và \>
Tìm kiếm một từ không đơn giản như lúc đầu xuất hiện. Chuỗi "the" sẽ khớp với từ "khác". Bạn có thể đặt khoảng trắng trước và sau các chữ cái và sử dụng biểu thức chính quy này: "the". Tuy nhiên, điều này không khớp với các từ ở đầu hoặc cuối dòng. Và nó không khớp với trường hợp có dấu chấm câu sau từ đó.
Có một giải pháp dễ dàng. Các ký tự "\ <" và "\>" tương tự như các neo "^" và "$", vì chúng không chiếm vị trí của một ký tự. Họ "neo" biểu thức giữa để chỉ khớp nếu nó nằm trên một ranh giới từ. Mẫu để tìm kiếm từ "the" sẽ là "\ <[tT] he \>". Ký tự trước "t" phải là ký tự dòng mới hoặc bất cứ thứ gì ngoại trừ một chữ cái, số hoặc gạch dưới. Ký tự sau "e" cũng phải là một ký tự không phải là số, chữ cái hoặc dấu gạch dưới hoặc nó có thể là kết thúc của ký tự dòng.
Backreferences - Ghi nhớ các mẫu với \ (, \) và \ 1
Một mô hình khác đòi hỏi một cơ chế đặc biệt là tìm kiếm các từ lặp đi lặp lại. Biểu thức "[az] [az]" sẽ khớp với bất kỳ hai chữ cái viết thường. Nếu bạn muốn tìm kiếm các dòng có hai chữ cái giống nhau liền kề, mẫu trên sẽ không có ích. Bạn cần một cách để nhớ những gì bạn tìm thấy, và xem nếu cùng một mô hình xảy ra một lần nữa. Bạn có thể đánh dấu một phần của mẫu bằng cách sử dụng "\ (" và "\)". Bạn có thể nhớ lại mẫu đã nhớ với "\" theo sau là một chữ số. Do đó, để tìm kiếm hai chữ cái giống nhau, hãy sử dụng "\ ([az] \) \ 1". Bạn có thể có 9 mẫu nhớ khác nhau. Mỗi lần xuất hiện của "\ (" bắt đầu một mẫu mới. Biểu thức chính quy phù hợp với bảng chữ cái 5 chữ cái, (ví dụ: "radar"), sẽ là
- \ ([az] \) \ ([az] \) [az] \ 2 \ 1
Vấn đề tiềm ẩn
Điều đó hoàn thành một cuộc thảo luận về biểu thức chính quy cơ bản. Trước khi tôi thảo luận về các phần mở rộng mà biểu thức mở rộng cung cấp, tôi muốn đề cập đến hai lĩnh vực có vấn đề tiềm ẩn.
Các ký tự "\ <" và "\>" đã được giới thiệu trong trình chỉnh sửa vi . Các chương trình khác không có khả năng này vào thời điểm đó. Ngoài ra , công cụ sửa đổi "\ { min , max \}" là các tiện ích mới và trước đó không có khả năng này. Điều này gây khó khăn cho người dùng mới làm quen với các biểu thức thông thường, vì dường như mỗi tiện ích có một quy ước khác nhau. Sun đã trang bị thêm thư viện biểu thức chính quy mới nhất cho tất cả các chương trình của họ, vì vậy tất cả chúng đều có cùng khả năng. Nếu bạn cố gắng sử dụng các tính năng mới hơn này trên các máy của nhà cung cấp khác, bạn có thể thấy chúng không hoạt động theo cùng một cách.
Điểm nhầm lẫn tiềm năng khác là phạm vi của mô hình khớp. Biểu thức chính quy phù hợp với mẫu dài nhất có thể. Đó là, biểu thức chính quy
- A. * B
phù hợp với "AAB" cũng như "AAAABBBBABCCCCBBBAAAB". Điều này không gây ra nhiều vấn đề khi sử dụng grep , bởi vì việc giám sát trong biểu thức chính quy sẽ chỉ khớp với nhiều dòng hơn mong muốn. Nếu bạn sử dụng sed và các mẫu của bạn sẽ được mang đi, bạn có thể sẽ xóa nhiều hơn bạn muốn.
Biểu thức chính quy mở rộng
Hai chương trình sử dụng biểu thức chính quy mở rộng: egrep và awk . Với các tiện ích mở rộng này, các ký tự đặc biệt đi trước dấu gạch chéo ngược không còn có ý nghĩa đặc biệt: "\ {", "\}", "\ <", "\>", "\ (", "\)" cũng như "\ chữ số ". Có một lý do rất tốt cho việc này, mà tôi sẽ trì hoãn giải thích để xây dựng sự hồi hộp.
Nhân vật "?" khớp với 0 hoặc 1 phiên bản của bộ ký tự trước đó và ký tự "+" khớp với một hoặc nhiều bản sao của bộ ký tự. Bạn không thể sử dụng \ {và \} trong các biểu thức chính quy mở rộng, nhưng nếu có thể, bạn có thể xem xét "?" giống như "\ {0,1 \}" và "+" giống với "\ {1, \}".
Đến bây giờ, bạn đang tự hỏi tại sao các biểu thức chính quy mở rộng thậm chí còn đáng sử dụng. Ngoại trừ hai chữ viết tắt, không có ưu điểm, và rất nhiều nhược điểm. Do đó, các ví dụ sẽ hữu ích.
Ba ký tự quan trọng trong các biểu thức chính quy mở rộng là "(", "|" và ")". Cùng nhau, họ cho phép bạn kết hợp một sự lựa chọn của các mẫu. Ví dụ: bạn có thể egrep để in tất cả các dòng From: và Tiêu đề: từ thư đến của bạn:
- egrep '^ (Từ | Chủ đề):' / usr / spool / mail / $ USER
Tất cả các dòng bắt đầu bằng "Từ:" hoặc "Chủ đề:" sẽ được in. Không có cách nào dễ dàng để làm điều này với các biểu thức thông thường cơ bản. Bạn có thể thử "^ [FS] [ru] [ob] [mj] e * c * t *:" và hy vọng bạn không có bất kỳ dòng nào bắt đầu bằng "Sromeet:". Biểu thức mở rộng không có ký tự "\ <" và "\>". Bạn có thể bù bằng cách sử dụng cơ chế xen kẽ. Kết hợp từ "the" ở đầu, giữa, cuối câu hoặc cuối dòng có thể được thực hiện với biểu thức chính quy mở rộng:
- (^ |) các ([^ az] | $)
Có hai lựa chọn trước từ, khoảng trắng hoặc bắt đầu của một dòng. Sau từ này, phải có một cái gì đó bên cạnh một chữ cái viết thường hoặc nếu không thì cuối dòng. Một phần thưởng bổ sung với các biểu thức chính quy mở rộng là khả năng sử dụng "*," "+," và "?" công cụ sửa đổi sau khi nhóm "(...)". Sau đây sẽ phù hợp với "một vấn đề đơn giản", "một vấn đề dễ dàng", cũng như "một vấn đề".
- dữ liệu egrep "a [n]? (đơn giản | dễ dàng)?"
Tôi hứa sẽ giải thích lý do tại sao các ký tự dấu gạch chéo ngược không hoạt động trong các biểu thức chính quy mở rộng. Chà, có lẽ "\ {... \}" và "\ <... \>" có thể được thêm vào các biểu thức mở rộng. Đây là những bổ sung mới nhất cho gia đình biểu hiện thường xuyên. Chúng có thể được thêm vào, nhưng điều này có thể khiến mọi người nhầm lẫn nếu những ký tự đó được thêm vào và "\ (... \)" thì không. Và không có cách nào để thêm chức năng đó vào các biểu thức mở rộng mà không thay đổi cách sử dụng hiện tại. Bạn có thấy tại sao không? Nó khá đơn giản. Nếu "(" có ý nghĩa đặc biệt, thì "\ (" phải là ký tự bình thường. Điều này trái ngược với các biểu thức chính quy cơ bản, trong đó "(" là bình thường và "\ (" là đặc biệt. Cách sử dụng dấu ngoặc đơn là không thể, và bất kỳ thay đổi nào cũng có thể phá vỡ các chương trình cũ.
Nếu biểu thức mở rộng được sử dụng "(.. | ...)" làm ký tự thông thường và "\ (... \ | ... \)" để chỉ định các mẫu thay thế, thì có thể có một bộ biểu thức chính quy có đầy đủ chức năng. Đây chính xác là những gì GNU emacs làm.
Phần còn lại của điều này là ghi chú ngẫu nhiên.
| Biểu hiện thông thường | Lớp học | Kiểu | Ý nghĩa |
| _ | |||
| . | tất cả các | Bộ ký tự | Một ký tự đơn (trừ dòng mới) |
| ^ | tất cả các | Mỏ neo | Bắt đầu của dòng |
| $ | tất cả các | Mỏ neo | Kết thúc dòng |
| [...] | tất cả các | Bộ ký tự | Phạm vi của các nhân vật |
| * | tất cả các | bổ nghĩa | không hoặc nhiều bản sao |
| \ < | Căn bản | Mỏ neo | Bắt đầu từ |
| \> | Căn bản | Mỏ neo | Hết từ |
| \ (.. \) | Căn bản | Phản ứng ngược | Nhớ mẫu |
| \ 1 .. \ 9 | Căn bản | Tài liệu tham khảo | Nhớ lại mẫu |
| _ + | Mở rộng | bổ nghĩa | Một hoặc nhiều bản sao |
| ? | Mở rộng | bổ nghĩa | Không hoặc một bản sao |
| \ {M, N \} | Mở rộng | bổ nghĩa | M đến N Bản sao |
| (... | ...) | Mở rộng | Mỏ neo | Hiển thị sự thay đổi |
| _ | |||
| \ (... \ | ... \) | EMACS | Mỏ neo | Hiển thị sự thay đổi |
| \ w | EMACS | Bộ ký tự | Nối một chữ cái trong một từ |
| \ | EMACS | Bộ ký tự | Đối diện với \ w |
Bộ ký tự POSIX
POSIX đã thêm các cách mới hơn và di động hơn để tìm kiếm các bộ ký tự. Thay vì sử dụng [a-zA-Z], bạn có thể thay thế 'a-zA-Z' bằng [: alpha:] hoặc để hoàn thiện hơn. thay thế [a-zA-Z] bằng [[: alpha:]]. Ưu điểm là điều này sẽ phù hợp với bộ ký tự quốc tế. Bạn có thể trộn kiểu cũ và kiểu POSIX mới, chẳng hạn như
grep '[1-9 [: alpha:]]'
Đây là danh sách điền
| Nhóm nhân vật | Ý nghĩa |
| [: alnum:] | Chữ và số |
| [: cntrl:] | Nhân vật điều khiển |
| [:thấp hơn:] | Chữ thường |
| [:không gian:] | Khoảng trắng |
| [: alpha:] | Bảng chữ cái |
| [: chữ số:] | Chữ số |
| [:in:] | Nhân vật có thể in |
| [:phía trên:] | Chữ hoa |
| [:chỗ trống:] | khoảng trắng, tab, v.v. |
| [: đồ thị:] | Ký tự có thể in và nhìn thấy |
| [: dấu câu:] | Chấm câu |
| [: xdigit:] | Chữ số mở rộng |
Lưu ý rằng một số người sử dụng [[: alpha:]] làm ký hiệu, nhưng '[...]' bên ngoài chỉ định một bộ ký tự.
Phần mở rộng Perl
| Biểu hiện thông thường | ||
| Lớp học | Kiểu | Ý nghĩa |
| \ t | Bộ ký tự | chuyển hướng |
| \ n | Bộ ký tự | dòng mới |
| \ r | Bộ ký tự | trở về |
| \ f | Bộ ký tự | hình thức |
| \ a | Bộ ký tự | báo thức |
| \ e | Bộ ký tự | bỏ trốn |
| \ 033 | Bộ ký tự | bát phân |
| \ x1B | Bộ ký tự | lục giác |
| \ c [ | Bộ ký tự | điều khiển |
| \ l | Bộ ký tự | chữ thường |
| bạn | Bộ ký tự | chữ hoa |
| \ L | Bộ ký tự | chữ thường |
| \ | Bộ ký tự | chữ hoa |
| \ E | Bộ ký tự | kết thúc |
| \ Q | Bộ ký tự | Trích dẫn |
| \ w | Bộ ký tự | Nối một ký tự "từ" |
| \ | Bộ ký tự | Khớp một ký tự không từ |
| \S | Bộ ký tự | Khớp một ký tự khoảng trắng |
| \S | Bộ ký tự | Khớp một ký tự không phải khoảng trắng |
| \ d | Bộ ký tự | Khớp một ký tự chữ số |
| \ D | Bộ ký tự | Khớp một ký tự không có chữ số |
| \ b | Mỏ neo | Nối một ranh giới từ |
| \ B | Mỏ neo | Khớp với một không (ranh giới từ) |
| \ A | Mỏ neo | Chỉ khớp ở đầu chuỗi |
| \ Z | Mỏ neo | Chỉ khớp với EOS hoặc trước dòng mới |
| \ z | Mỏ neo | Chỉ khớp ở cuối chuỗi |
| \ G | Mỏ neo | Chỉ khớp khi m // g trước đó rời đi |
Ví dụ về PERL Biểu thức chính quy mở rộng, nhiều dòng
m {\ ( (# Nhóm bắt đầu [^ ()] + # bất cứ thứ gì trừ '(' hoặc ')' | # hoặc là \ ([^ ()] * \) ) + # nhóm cuối \) } x


