- English
- Español
- Français
- Português do Brasil
- 中文版
- 日本語
- 한국어
- Turkish
- Greek
- Magyar
- Polish
- Русский
- Tiếng Việt
Biểu thức chính quy là một nhóm các ký tự hoặc ký hiệu được sử dụng để tìm một mẫu cụ thể từ một văn bản.
Biểu thức chính quy là một khuôn mẫu được khớp với chuỗi các từ, từ trái sang phải. Từ "Biểu thức chính quy" là một câu cửa miệng, bạn thường sẽ tìm thấy thuật ngữ viết tắt là "regex" hoặc "regexp". Biểu thức chính quy được sử dụng để thay thế một văn bản trong một chuỗi, xác thực mẫu, trích xuất một chuỗi con từ một chuỗi dựa trên khớp mẫu và hơn thế nữa.
Hãy tưởng tượng bạn đang viết một ứng dụng và bạn muốn đặt quy tắc khi người dùng chọn tên người dùng của họ. Chúng tôi muốn cho phép tên người dùng chứa các chữ cái, số, dấu gạch dưới và dấu gạch nối. Chúng tôi cũng muốn giới hạn số lượng ký tự trong tên người dùng để nó trông không xấu. Chúng tôi sử dụng biểu thức chính quy sau để xác thực tên người dùng:
Trên biểu thức chính quy có thể chấp nhận các chuỗi john_doe
, jo-hn_doe
và john12_as
. Nó không khớp với Jo
vì chuỗi đó chứa chữ hoa và nó quá ngắn.
Biểu thức chính quy chỉ là một mẫu các ký tự mà chúng ta sử dụng để thực hiện tìm kiếm trong văn bản. Ví dụ, biểu thức chính quy the
có nghĩa là: chữ t
, tiếp theo là chữ h
, tiếp theo là chữ e
.
"the" => The fat cat sat on the mat.
Biểu thức chính quy 123
khớp với chuỗi 123
. Biểu thức chính quy được khớp với chuỗi đầu vào bằng cách so sánh từng ký tự trong biểu thức chính quy với từng ký tự trong chuỗi đầu vào, lần lượt từng ký tự. Biểu thức chính quy thường phân biệt chữ hoa chữ thường nên biểu thức chính quy The
sẽ không khớp với chuỗi the
.
"The" => The fat cat sat on the mat.
Các ký tự meta
là các khối xây dựng của các biểu thức chính quy. Các ký tự meta
không biểu diễn chính nó mà thay vào đó được diễn giải theo một cách đặc biệt nào đó. Một số ký tự meta
có ý nghĩa đặc biệt và được viết bên trong dấu ngoặc vuông. Các ký tự meta như sau:
Meta character | Description |
---|---|
. | Khớp với tất cả các kí tự trừ dấu xuống dòng. |
[ ] | Lớp kí tự. Khớp với bất kỳ ký tự nào nằm giữa dấu ngoặc vuông. |
[^ ] | Lớp kí tự phủ định. Khớp với bất kỳ ký tự nào không có trong dấu ngoặc vuông. |
* | Khớp 0 hoặc nhiều lần lặp lại của kí tự trước. |
+ | Khớp 1 hoặc nhiều lần lặp lại của kí tự trước. |
? | Làm cho kí tự trước tùy chọn. |
{n,m} | Braces. Khớp ít nhất là "n" nhưng không nhiều hơn "m" lặp lại của kí tự trước. |
(xyz) | Nhóm kí tự. Khớp các ký tự xyz theo thứ tự chính xác đó. |
| | Thay thế. Khớp các ký tự trước hoặc ký tự sau ký hiệu. |
\ | Thoát khỏi kí tự tiếp theo. Điều này cho phép bạn khớp các ký tự dành riêng [ ] ( ) { } . * + ? ^ $ \ | |
^ | Khớp với sự bắt đầu của đầu vào. |
$ | Khớp với kết thúc đầu vào. |
Full stop .
là ví dụ đơn giản nhất về ký tự meta. Kí tự meta .
khớp với bất kì kí tự nào. Nó sẽ không khớp kí tự trả về (return) hoặc xuống dòng (newline)
Ví dụ, biểu thức chính quy .ar
có ý nghĩa: bất kỳ ký tự nào, theo sau là chữ a
, tiếp theo là chữ r
.
".ar" => The car parked in the garage.
Bộ ký tự cũng được gọi là lớp kí tự. Dấu ngoặc vuông được sử dụng để chỉ định bộ ký tự. Sử dụng dấu gạch nối bên trong bộ ký tự để chỉ định phạm vi của các ký tự. Thứ tự của phạm vi ký tự trong dấu ngoặc vuông không quan trọng.
Ví dụ: biểu thức chính quy [Tt]he
có nghĩa là: chữ hoa T
hoặc chữ thường t
, theo sau là chữ h
, tiếp theo là chữ e
.
"[Tt]he" => The car parked in the garage.
Tuy nhiên, khoảng thời gian bên trong một bộ ký tự có nghĩa là một khoảng thời gian theo nghĩa đen. Biểu thức chính quy ar[.]
Có nghĩa là: ký tự chữ thường a
, theo sau là chữ r
, theo sau là kí tự .
.
"ar[.]" => A garage is a good place to park a car.
Nói chung, biểu tượng dấu mũ biểu thị sự bắt đầu của chuỗi, nhưng khi nó được gõ sau dấu ngoặc vuông mở, nó sẽ phủ định bộ ký tự. Ví dụ: biểu thức chính quy [^ c]ar
có nghĩa là: bất kỳ ký tự nào ngoại trừ c
, theo sau là ký tự a
, theo sau là chữ r
.
"[^c]ar" => The car parked in the garage.
Theo dõi các ký tự meta, +
, *
hoặc ?
được sử dụng để xác định số lần mô hình con (subpattern) có thể xảy ra. Những kí tự meta này hành động khác nhau trong các tình huống khác nhau.
Biểu tượng *
khớp 0 hoặc nhiều lần lặp lại của trình so khớp trước. Biểu thức chính quy a*
có nghĩa là: 0 hoặc nhiều lần lặp lại ký tự chữ thường trước a
. Nhưng nếu nó xuất hiện sau một bộ ký tự hoặc lớp thì nó sẽ tìm thấy sự lặp lại của toàn bộ bộ ký tự. Ví dụ: biểu thức chính quy [a-z]*
có nghĩa là: bất kỳ số lượng chữ cái viết thường trong một hàng.
"[a-z]*" => The car parked in the garage #21.
Biểu tượng *
có thể được sử dụng với ký tự meta. để khớp với bất kỳ chuỗi ký tự nào .*
. Biểu tượng *
có thể được sử dụng với ký tự khoảng trắng \s
để khớp với một chuỗi các ký tự khoảng trắng.
Ví dụ: biểu thức \s*cat\s*
có nghĩa là: không hoặc nhiều khoảng trắng, theo sau là ký tự chữ thường c
, theo sau là ký tự chữ thường a
, theo sau là ký tự chữ thường t
, tiếp theo là 0 hoặc nhiều khoảng trắng.
"\s*cat\s*" => The fat cat sat on the concatenation.
Biểu tượng +
khớp với một hoặc nhiều lần lặp lại của ký tự trước.
Ví dụ: biểu thức chính quy c.+t
có nghĩa là: chữ thường chữ c
, theo sau là ít nhất một ký tự, tiếp theo là ký tự chữ thường t
. Nó cần phải được làm rõ rằng t
là t
cuối cùng trong câu.
"c.+t" => The fat cat sat on the mat.
Trong biểu thức chính quy các ký tự meta ?
làm cho ký tự trước là một tùy chọn. Biểu tượng này khớp với 0 hoặc một thể hiện (instance ) của ký tự trước. Ví dụ: biểu thức chính quy [T]?he
có nghĩa là: Tùy chọn chữ hoa chữ T
, theo sau là ký tự chữ thường h
, tiếp theo là ký tự chữ thường e
.
"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.
Trong các dấu ngoặc nhọn thông thường còn được gọi là bộ định lượng được sử dụng để chỉ định số lần mà một ký tự hoặc một nhóm ký tự có thể được lặp lại. Ví dụ: biểu thức chính quy [0-9]{2,3}
có nghĩa là: Ghép ít nhất 2 chữ số nhưng không quá 3 (ký tự trong phạm vi từ 0 đến 9).
"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
Chúng ta có thể bỏ qua số thứ hai. Ví dụ: biểu thức chính quy [0-9]{2,}
có nghĩa là: Ghép 2 chữ số trở lên. Nếu chúng tôi cũng xóa dấu phẩy, biểu thức chính quy [0-9]{3}
có nghĩa là: Ghép chính xác 3 chữ số.
"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
Một nhóm capturing là một nhóm các mẫu con được viết bên trong Dấu ngoặc đơn (...)
. Giống như chúng ta đã thảo luận trước đó trong biểu thức chính quy nếu chúng ta đặt một bộ định lượng sau một ký tự thì nó sẽ lặp lại ký tự trước. Nhưng nếu chúng ta đặt bộ định lượng sau một nhóm capturing thì nó lặp lại toàn bộ nhóm capturing. Ví dụ: biểu thức chính quy (ab)*
khớp với 0 hoặc nhiều lần lặp lại của ký tự "ab". Chúng ta cũng có thể sử dụng luân phiên |
kí tự meta trong nhóm capturing. Ví dụ: biểu thức chính quy (c|g|p)ar
có nghĩa là: ký tự chữ thường c
, g
hoặc p
, theo sau là ký tự a
, tiếp theo là ký tự r
.
"(c|g|p)ar" => The car is parked in the garage.
Lưu ý rằng các nhóm capturing không chỉ khớp mà còn capturing các ký tự để sử dụng trong ngôn ngữ gốc. Ngôn ngữ gốc có thể là python hoặc javascript hoặc hầu như bất kỳ ngôn ngữ nào thực hiện các biểu thức chính quy trong định nghĩa hàm.
Nhóm không capturing là nhóm capturing chỉ khớp với các ký tự, nhưng không capturing được nhóm. Một nhóm không capturing được ký hiệu là ?
theo sau là :
trong ngoặc đơn (...)
.
Ví dụ: biểu thức chính quy (?:c|g|p)ar
tương tự như (c|g|p)ar
ở chỗ nó khớp với các ký tự giống nhau nhưng sẽ không tạo nhóm capturing.
"(?:c|g|p)ar" => The car is parked in the garage.
Các nhóm không capturing có thể có ích khi được sử dụng trong chức năng tìm và thay thế hoặc khi trộn với các nhóm capturing để giữ tổng quan khi sản xuất bất kỳ loại đầu ra nào khác. Xem thêm 4. Lookaround.
Trong một biểu thức chính quy, thanh dọc |
được sử dụng để xác định xen kẽ. Sự xen kẽ giống như một câu lệnh OR giữa nhiều biểu thức. Bây giờ, bạn có thể nghĩ rằng bộ ký tự và luân phiên hoạt động theo cùng một cách. Nhưng sự khác biệt lớn giữa bộ ký tự và xen kẽ là bộ ký tự hoạt động ở cấp độ ký tự nhưng xen kẽ hoạt động ở cấp độ biểu thức.
Ví dụ: biểu thức chính quy (T|t)he|car
có nghĩa là: hoặc (ký tự chữ T
hoặc chữ thường t
, theo sau là ký tự chữ thường h
, tiếp theo là ký tự chữ thường e
) OR (ký tự chữ thường c
, tiếp theo là ký tự chữ thường a
, theo sau bằng ký tự viết thường r
). Lưu ý rằng tôi đặt dấu ngoặc đơn cho rõ ràng, để cho thấy rằng một trong hai biểu thức trong ngoặc đơn có thể được đáp ứng và nó sẽ khớp.
"(T|t)he|car" => The car is parked in the garage.
Dấu gạch chéo ngược \
được sử dụng trong biểu thức chính quy để thoát ký tự tiếp theo. Điều này cho phép chúng tôi chỉ định một biểu tượng là một ký tự phù hợp bao gồm các ký tự dành riêng {} [] / \ *. $ ^ | ?
. Để sử dụng một ký tự đặc biệt, ta dùng \
làm ký tự trùng khớp trước kí tự ta muốn dùng.
Ví dụ, biểu thức chính quy .
được sử dụng để khớp với bất kỳ ký tự nào ngoại trừ dòng mới. Bây giờ để phù hợp .
trong một chuỗi đầu vào, biểu thức chính quy (f|c|m)at\.?
có nghĩa là: chữ thường f
, c
hoặc m
, theo sau là ký tự chữ thường a
, tiếp theo là chữ thường chữ t
, theo sau là tùy chọn .
tính cách.
"(f|c|m)at\.?" => The fat cat sat on the mat.
Trong các biểu thức chính quy, chúng tôi sử dụng các anchors để kiểm tra xem biểu tượng phù hợp là biểu tượng bắt đầu hay biểu tượng kết thúc của chuỗi đầu vào. Các anchors có hai loại: Loại thứ nhất là Caret ^
kiểm tra xem ký tự khớp có phải là ký tự bắt đầu của đầu vào không và loại thứ hai là Dollar $
kiểm tra xem ký tự khớp có phải là ký tự cuối cùng của chuỗi đầu vào không.
Biểu tượng Caret ^
được sử dụng để kiểm tra xem ký tự khớp có phải là ký tự đầu tiên của chuỗi đầu vào không. Nếu chúng ta áp dụng biểu thức chính quy sau ^a
( nếu a là ký hiệu bắt đầu) cho chuỗi đầu vào abc
thì nó khớp với a
. Nhưng nếu chúng ta áp dụng biểu thức chính quy ^b
trên chuỗi đầu vào ở trên thì nó không khớp với bất cứ thứ gì. Bởi vì trong chuỗi đầu vào abc
"b" không phải là ký hiệu bắt đầu. Chúng ta hãy xem một biểu thức chính quy khác ^(T|t)he
có nghĩa là: ký tự chữ hoa T
hoặc ký tự chữ thường t
là ký hiệu bắt đầu của chuỗi đầu vào, tiếp theo là ký tự chữ thường h
, tiếp theo là ký tự chữ thường e
.
"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.
Biểu tượng Dollar $
được sử dụng để kiểm tra xem ký tự khớp có phải là ký tự cuối cùng của chuỗi đầu vào không. Ví dụ: biểu thức chính quy (at\.)$
có nghĩa là: ký tự chữ thường a
, theo sau là ký tự chữ thường t
, theo sau là .
ký tự và bộ so khớp phải là cuối chuỗi.
"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat. sat. on the mat.
Biểu thức chính quy cung cấp các shorthand cho các bộ ký tự thường được sử dụng, cung cấp các shorthand thuận tiện cho các biểu thức thông thường được sử dụng. Các bộ ký tự shorthand như sau:
Shorthand | Description |
---|---|
. | Bất kỳ kí tự nào ngoại trừ dòng mới |
\w | Khớp các ký tự chữ và số: [a-zA-Z0-9_] |
\W | Khớp các ký tự không phải chữ và số: [^\w] |
\d | khớp với số trong khoảng: [0-9] |
\D | Khớp không có chữ số: [^\d] |
\s | Khớp các ký tự khoảng trắng: [\t\n\f\r\p{Z}] |
\S | Khớp với ký tự không phải khoảng trắng: [^\s] |
Lookbehind và lookahead (còn được gọi là lookaround) là các loại nhóm không capturing cụ thể (Được sử dụng để khớp với mẫu nhưng không được bao gồm trong danh sách phù hợp). Lookarounds
sử dụng khi chúng ta có điều kiện mẫu này được đi trước hoặc theo sau bởi một mẫu khác.
Ví dụ: chúng tôi muốn nhận tất cả các số có trước ký tự $
từ chuỗi đầu vào sau $4,44 và $10,88
. Chúng tôi sẽ sử dụng biểu thức chính quy sau (?<=\$)[0-9\.]*
có nghĩa là: lấy tất cả các số có chứa .
ký tự và đứng trước ký tự $
. Sau đây là những cái nhìn được sử dụng trong các biểu thức thông thường:
Kí hiệu | Mô tả |
---|---|
?= | Positive Lookahead |
?! | Negative Lookahead |
?<= | Positive Lookbehind |
?<! | Negative Lookbehind |
Positive lookahead
khẳng định rằng phần đầu tiên của biểu thức phải được theo sau bởi biểu thức lookahead expression
. Phần khớp trả về (The returned match) chỉ chứa văn bản được khớp bởi phần đầu tiên của biểu thức. Để xác định một positive lookahead
, dấu ngoặc đơn được sử dụng. Trong các dấu ngoặc đơn đó, một dấu hỏi có dấu bằng được sử dụng như thế này: (?=...)
. Biểu thức Lookahead
được viết sau dấu bằng trong ngoặc đơn.
Ví dụ: biểu thức chính quy (T|t)he(?=\Sfat)
có nghĩa là: tùy ý khớp chữ thường chữ t
hoặc chữ hoa chữ T
, theo sau là chữ h
, tiếp theo là chữ e
. Trong ngoặc đơn, chúng tôi xác định positive lookahead
cho biết công cụ (engine) biểu thức chính quy khớp với The
hoặc the
cái mà được đứng trước bởi từ fat
.
"(T|t)he(?=\sfat)" => The fat cat sat on the mat.
Negative lookahead
được sử dụng khi chúng ta cần lấy tất cả các kết quả khớp từ chuỗi đầu vào không được theo sau bởi một mẫu. Negative lookahead
được định nghĩa giống như chúng ta định nghĩa positive lookahead
nhưng sự khác biệt duy nhất là thay vì bằng ký tự =
chúng ta sử dụng kí tự phủ định !
tức là (?! ...)
.
Chúng ta hãy xem biểu thức chính quy sau đây: (T|t)he(?!\sfat)
có nghĩa là: lấy tất cả các từ The
hoặc the
từ chuỗi đầu vào không được đứng trước bởi từ fat
trước một ký tự khoảng trắng.
"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
Positive lookbehind
được sử dụng để có được tất cả mẫu khớp cái mà theo sau bởi một mẫu cụ thể. Positive lookbehind
được biểu thị bởi (?<=...)
.
Ví dụ: biểu thức chính quy (?<=(T|t)he\s)(fat|mat)
có nghĩa là: lấy tất cả các từ fat
hoặc mat
từ chuỗi đầu vào, cái mà sau từ The
hoặc the
.
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
Negative lookbehind
được sử dụng để có được tất cả các từ khớp không có trước một mẫu cụ thể. Negative lookbehind
được ký hiệu là (?<!...)
.
Ví dụ: biểu thức chính quy (?<!(T|t)he\s)(cat)
có nghĩa là: lấy tất cả các từ cat
từ chuỗi đầu vào, không nằm sau từ The
hoặc the
.
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
Cờ (flags) cũng được gọi là bổ nghĩa (modifiers) vì chúng sửa đổi đầu ra của biểu thức chính quy. Các cờ này có thể được sử dụng theo bất kỳ thứ tự hoặc kết hợp nào và là một phần không thể thiếu của RegExp.
Cờ | Mô tả |
---|---|
i | Case insensitive: Đặt khớp với mẫu không phân biệt chữ hoa chữ thường. |
g | Global Search: Tìm kiếm một mẫu trong suốt chuỗi đầu vào. |
m | Multiline: ký tự Anchor meta hoạt động trên mỗi dòng. |
Công cụ sửa đổi i
được sử dụng để thực hiện khớp không phân biệt chữ hoa chữ thường.
Ví dụ: biểu thức chính quy /The/gi
có nghĩa là: chữ hoa chữ T
, theo sau là ký tự chữ thường h
, tiếp theo là ký tự e
. Và ở cuối biểu thức chính quy, cờ i
báo cho công cụ biểu thức chính quy bỏ qua trường hợp này. Như bạn có thể thấy, chúng tôi cũng đã cung cấp cờ g
vì chúng tôi muốn tìm kiếm mẫu trong toàn bộ chuỗi đầu vào.
"The" => The fat cat sat on the mat.
"/The/gi" => The fat cat sat on the mat.
Công cụ sửa đổi g
được sử dụng để thực hiện khớp toàn cầu (tìm tất cả các từ có thể khớp thay vì dừng sau lần khớp đầu tiên).
Ví dụ: biểu thức chính quy /.(at)/g
có nghĩa là: bất kỳ ký tự nào ngoại trừ dòng mới, theo sau là ký tự chữ thường a
, tiếp theo là ký tự chữ thường t
. Vì chúng tôi đã cung cấp cờ g
ở cuối biểu thức chính quy nên bây giờ nó sẽ tìm thấy tất cả các kết quả khớp trong chuỗi đầu vào, không chỉ là đầu tiên (là hành vi mặc định).
"/.(at)/" => The fat cat sat on the mat.
"/.(at)/g" => The fat cat sat on the mat.
Công cụ sửa đổi m
được sử dụng để thực hiện khớp nhiều dòng. Như chúng ta đã thảo luận về các anchors (^, $)
trước đó, được sử dụng để kiểm tra xem mẫu là phần đầu của phần đầu vào hay phần cuối của chuỗi đầu vào. Nhưng nếu chúng ta muốn các anchors hoạt động trên mỗi dòng, chúng ta sử dụng cờ m
.
Ví dụ: biểu thức chính quy /at(.)?$/gm
có nghĩa là: ký tự chữ thường a
, theo sau là ký tự chữ thường t
, tùy chọn mọi thứ trừ dòng mới. Và vì cờ m
bây giờ công cụ biểu thức chính quy khớp với mẫu ở cuối mỗi dòng trong một chuỗi.
"/.at(.)?$/" => The fat cat sat on the mat.
"/.at(.)?$/gm" => The fat cat sat on the mat.
Theo mặc định, regex sẽ thực hiện greedy matching, có nghĩa là nó sẽ khớp càng lâu càng tốt. chúng ta có thể sử dụng ?
để khớp theo cách lười biếng có nghĩa là càng ngắn càng tốt
"/(.*at)/" => The fat cat sat on the mat.
"/(.*?at)/" => The fat cat sat on the mat.
- Open pull request with improvements
- Discuss ideas in issues
- Spread the word
- Reach out with any feedback
MIT © Zeeshan Ahmad