RegEX - Cheatsheet
Tổng hợp RegEX Cheatsheet - Tham khảo về RegEX, bao gồm các ký hiệu, phạm vi, nhóm...
🔖 Gợi ý từ Admin
📝 Tài liệu phỏng vấn kiến thức lập trình: Xem tại đây!!!
📌 Tìm hiểu về thuật toán: Xem tại đây!!!
📌 Roadmaps - Lộ trình trở thành một lập trình viên: Xem tại đây!!!
⚡️ Cheatsheet các ngôn ngữ lập trình: Xem tại đây!!!
⚡️ Handbook lập trình: Xem tại đây!!!
I. Tổng hợp RegEx Cheatsheet
1. Cơ bản
⚡️ Các nhóm ký tự (Character Classes)
RegEX | Mô tả |
---|---|
[abc] | Một ký tự duy nhất trong: a, b hoặc c |
[^abc] | Một ký tự ngoại trừ: a, b hoặc c |
[a-z] | Một ký tự trong khoảng: a-z |
[^a-z] | Một ký tự không nằm trong khoảng: a-z |
[0-9] | Một chữ số trong khoảng: 0-9 |
[a-zA-Z] | Một ký tự trong khoảng: a-z hoặc A-Z |
[a-zA-Z0-9] | Một ký tự trong khoảng: a-z, A-Z hoặc 0-9 |
⚡️ Định lượng (Quantifiers)
RegEX | Mô tả |
---|---|
a? | Không hoặc một ký tự a |
a* | Không hoặc nhiều ký tự a |
a+ | Một hoặc nhiều ký tự a |
[0-9]+ | Một hoặc nhiều chữ số 0-9 |
a{3} | Chính xác 3 ký tự a |
a{3,} | 3 hoặc nhiều ký tự a |
a{3,6} | Từ 3 đến 6 ký tự a |
a* | Định lượng tham lam |
a*? | Định lượng lười biếng |
a*+ | Định lượng sở hữu |
⚡️ Các ký tự đặc biệt phổ biến (Common Metacharacters)
RegEX | Mô tả |
---|---|
. | Bất kỳ ký tự nào (ngoại trừ ký tự xuống dòng) |
^ | Bắt đầu chuỗi |
$ | Kết thúc chuỗi |
* | 0 hoặc nhiều lần của ký tự trước đó |
+ | 1 hoặc nhiều lần của ký tự trước đó |
? | 0 hoặc 1 lần của ký tự trước đó |
\ | Gánh đảo, làm mất đi ý nghĩa đặc biệt của ký tự |
[] | Tập hợp các ký tự cho phép |
| | OR logigal (hoặc) |
() | Nhóm các biểu thức để thực hiện hoặc phép đảo ngược |
{} | Đặc tả số lần xuất hiện của biểu thức trước đó |
⚡️ Các ký hiệu Meta (Meta Sequences)
RegEX | Mô tả |
---|---|
. | Bất kỳ ký tự đơn nào |
\s | Bất kỳ ký tự trắng nào (khoảng trắng, tab, xuống dòng, vv.) |
\S | Bất kỳ ký tự không phải trắng nào |
\d | Bất kỳ chữ số nào (tương đương với [0-9]) |
\D | Bất kỳ ký tự không phải số nào (tương đương với [^0-9]) |
\w | Bất kỳ ký tự từ (word character) nào |
\W | Bất kỳ ký tự không phải từ nào |
\X | Bất kỳ chuỗi Unicode nào, bao gồm cả xuống dòng |
\C | Ký tự dữ liệu đơn |
\R | Dấu xuống dòng Unicode |
\v | Ký tự khoảng trắng dọc (vertical whitespace) |
\V | Phủ định của \v - bất cứ thứ gì ngoại trừ xuống dòng và tab dọc |
\h | Ký tự khoảng trắng ngang (horizontal whitespace) |
\H | Phủ định của \h |
\K | Đặt lại sự khớp (Reset match) |
\n | Kết quả sự khớp thứ n |
\pX | Thuộc tính Unicode X |
\p{...} | Thuộc tính Unicode hoặc loại kịch bản |
\PX | Phủ định của \pX |
\P{...} | Phủ định của \p |
\Q...\E | Trích dẫn; xem như chúng là chữ cái |
\k<name> | Khớp với tên mẫu con name (Match subpattern name) |
\k'name' | Khớp với tên mẫu con name (Match subpattern name) |
\k{name} | Khớp với tên mẫu con name (Match subpattern name) |
\gn | Khớp với mẫu con thứ n |
\g{n} | Khớp với mẫu con thứ n |
\g<n> | Lặp lại mẫu con thứ n |
\g'n' | Lặp lại mẫu con thứ n |
\g{-n} | Khớp với mẫu con trước đó tương đối thứ n |
\g<+n> | Lặp lại mẫu con kế tiếp tương đối thứ n |
\g'+n' | Lặp lại mẫu con kế tiếp tương đối thứ n |
\g'letter' | Lặp lại mẫu con tên bắt đầu bằng chữ cái letter |
\g{letter} | Khớp với mẫu con trước đó tên bắt đầu bằng chữ cái letter |
\g<letter> | Lặp lại mẫu con tên bắt đầu bằng chữ cái letter |
\xYY | Ký tự hex YY |
\x{YYYY} | Ký tự hex YYYY |
\ddd | Ký tự octal ddd |
\cY | Ký tự kiểm soát Y |
[\b] | Ký tự Backspace |
\ | Làm cho bất kỳ ký tự nào trở nên literal |
⚡️ Ký tự móc (Anchors)
RegEX | Mô tả |
---|---|
\G | Bắt đầu của sự khớp (match) |
^ | Bắt đầu của chuỗi |
$ | Kết thúc của chuỗi |
\A | Bắt đầu của chuỗi |
\Z | Kết thúc của chuỗi |
\z | Kết thúc tuyệt đối của chuỗi |
\b | Một biên (boundary) của từ |
\B | Không phải biên (boundary) của từ |
⚡️ Thay thế (Substitution)
RegEX | Mô tả |
---|---|
\0 | Toàn bộ nội dung của sự khớp (match) |
\1 | Nội dung trong nhóm bắt (capture) 1 |
$1 | Nội dung trong nhóm bắt (capture) 1 |
${foo} | Nội dung trong nhóm bắt (capture) foo |
\x20 | Giá trị thay thế thập lục phân |
\x{06fa} | Giá trị thay thế thập lục phân |
\t | Tab |
\r | Kí tự xuống dòng |
\n | Kí tự xuống dòng mới |
\f | Kí tự xuống dòng mới |
\U | Biến đổi thành chữ in hoa |
\L | Biến đổi thành chữ thường |
\E | Chấm dứt bất kỳ biến đổi nào |
⚡️ Nhóm Constructs (Group Constructs)
RegEX | Mô tả |
---|---|
(...) | Bắt(capture) tất cả mọi thứ nằm trong ngoặc |
(a|b) | Khớp (match) với a hoặc b |
(?:...) | Khớp (match) với tất cả mọi thứ nằm trong ngoặc |
(?>...) | Nhóm nguyên tử (không bắt) |
(?|...) | Sao chép lại số nhóm mẫu |
(?#...) | Chú thích |
(?'name'...) | Nhóm bắt (capture) có tên là "name" |
(?<name>...) | Nhóm bắt (capture) có tên là "name" |
(?P<name>...) | Nhóm bắt (capture) có tên là "name" |
(?imsxXU) | Các bộ điều chỉnh nội suy |
(?(DEFINE)...) | Định nghĩa mẫu trước khi sử dụng chúng |
⚡️ Khẳng định (Assertions)
RegEX | Mô tả |
---|---|
(?(1)có|không) | Câu lệnh có điều kiện |
(?(R)có|không) | Câu lệnh có điều kiện |
(?(R#)có|không) | Câu lệnh có điều kiện đệ quy |
(?(R&name)có|không) | Câu lệnh có điều kiện |
(?(?=...)có|không) | Câu lệnh có điều kiện nhìn vào |
(?(?<=...)có|không) | Câu lệnh có điều kiện nhìn lùi vào |
⚡️ Nhìn và kiểm tra (Lookarounds): Nhìn và kiểm tra cho phép bạn khớp (match) một nhóm trước (nhìn lùi - lookbehind) hoặc sau (nhìn vào - lookahead) biểu thức chính mà không bao gồm nó trong kết quả.
RegEX | Mô tả |
---|---|
(?=...) | Nhìn vào tích cực |
(?!...) | Nhìn vào tiêu cực |
(?<=...) | Nhìn lùi tích cực |
(?<!...) | Nhìn lùi tiêu cực |
⚡️ Cờ/Hiệu chỉnh (Flags/Modifiers)
RegEX | Mô tả |
---|---|
g | Toàn cục |
m | Nhiều dòng |
i | Không phân biệt chữ hoa thường |
x | Bỏ qua khoảng trắng |
s | Một dòng |
u | Unicode |
X | Mở rộng |
U | Không tham lam |
A | Gắn kết |
J | Tên nhóm trùng lặp |
⚡️ Đệ quy (Recurse)
RegEX | Mô tả |
---|---|
(?R) | Đệ quy toàn bộ biểu thức |
(?1) | Đệ quy vào nhóm con đầu tiên |
(?+1) | Đệ quy vào nhóm con tương đối đầu tiên |
(?&name) | Đệ quy vào nhóm con với tên |
(?P=name) | Kết hợp với nhóm con với tên |
(?P>name) | Đệ quy vào nhóm con với tên |
⚡️ POSIX Character Classes
Lớp ký tự POSIX | Tương đương | Ý nghĩa |
---|---|---|
[[:alnum:]] | [0-9A-Za-z] | Chữ cái và chữ số |
[[:alpha:]] | [A-Za-z] | Chữ cái |
[[:ascii:]] | [\x00-\x7F] | Mã ASCII từ 0-127 |
[[:blank:]] | [\t ] | Khoảng trắng hoặc tab |
[[:cntrl:]] | [\x00-\x1F\x7F] | Ký tự điều khiển |
[[:digit:]] | [0-9] | Chữ số thập phân |
[[:graph:]] | [[:alnum:][:punct:]] | Ký tự hiển thị (không phải khoảng trắng) |
[[:lower:]] | [a-z] | Chữ cái thường |
[[:print:]] | [ -~] == [ [:graph:]] | Ký tự hiển thị |
[[:space:]] | [\t\n\v\f\r ] | Khoảng trắng |
[[:upper:]] | [A-Z] | Chữ cái in hoa |
[[:word:]] | [0-9A-Za-z_] | Ký tự trong từ |
[[:xdigit:]] | [0-9A-Fa-f] | Chữ số hexa |
[[:<:]] | [\b(?=\w)] | Bắt đầu từ |
[[:>:]] | [\b(?<=\w)] | Kết thúc từ |
⚡️ Control verb
RegEx | Mô tả |
---|---|
(*ACCEPT) | Điều khiển |
(*FAIL) | Điều khiển |
(*MARK:NAME) | Điều khiển |
(*COMMIT) | Điều khiển |
(*PRUNE) | Điều khiển |
(*SKIP) | Điều khiển |
(*THEN) | Điều khiển |
(*UTF) | Sửa đổi mẫu |
(*UTF8) | Sửa đổi mẫu |
(*UTF16) | Sửa đổi mẫu |
(*UTF32) | Sửa đổi mẫu |
(*UCP) | Sửa đổi mẫu |
(*CR) | Sửa đổi dòng |
(*LF) | Sửa đổi dòng |
(*CRLF) | Sửa đổi dòng |
(*ANYCRLF) | Sửa đổi dòng |
(*ANY) | Sửa đổi dòng |
\R | Sửa đổi dòng |
(*BSR_ANYCRLF) | Sửa đổi dòng |
(*BSR_UNICODE) | Sửa đổi dòng |
(*LIMIT_MATCH=x) | Sửa đổi engine regex |
(*LIMIT_RECURSION=d) | Sửa đổi engine regex |
(*NO_AUTO_POSSESS) | Sửa đổi engine regex |
(*NO_START_OPT) | Sửa đổi engine regex |
2. Ví dụ về regex
⚡️ Ký tự (character): Sử dụng \ để tìm kiếm các ký tự đặc biệt sau: [ \ ^ $ . | ? * + ( ) { }
RegEX | Mô tả |
---|---|
ring | Kết hợp với ring, springboard, vv. |
. | Kết hợp với a, 9, +, vv. |
h.o | Kết hợp với hoo, h2o, h/o, vv. |
ring\? | Kết hợp với ring? |
\(quiet\) | Kết hợp với (quiet) |
c:\\windows | Kết hợp với c:\windows |
⚡️ Lựa chọn (Alternatives): Sắp xếp từ dài đến ngắn khi các lựa chọn chồng lấn nhau.
RegEX | Mô tả |
---|---|
cat|dog | Kết hợp với cat hoặc dog |
id|identity | Kết hợp với id hoặc identity |
identity|id | Kết hợp với id hoặc identity |
⚡️ Lớp ký tự (Character classes): trong [ ] luôn luôn phải bỏ . \ ] và đôi khi là ^ - .
RegEX | Mô tả |
---|---|
[aeiou] | Kết hợp với bất kỳ nguyên âm nào |
[^aeiou] | Kết hợp với MỘT KHÔNG nguyên âm |
r[iau]ng | Kết hợp với ring, wrangle, sprung, v.v. |
gr[ae]y | Kết hợp với gray hoặc grey |
[a-zA-Z0-9] | Kết hợp với bất kỳ chữ cái hoặc số nào |
[\u3a00-\ufa99] | Kết hợp với bất kỳ ký tự Unicode Hàn (中文) nào |
⚡️ Các lớp viết tắt (Shorthand classes)
RegEX | Mô tả |
---|---|
\w | Ký tự "word" (chữ cái, số hoặc gạch dưới) |
\d | Chữ số |
\s | Khoảng trắng (khoảng trống, tab, vtab, dòng mới) |
\W, \D, hoặc \S | Không phải word, digit hoặc whitespace |
[\D\S] | Có nghĩa là không phải digit hoặc whitespace, cả hai đều phù hợp |
[^\d\s] | Không cho phép digit và khoảng trắng |
⚡️ Xuất hiện (Occurrences)
RegEX | Mô tả |
---|---|
colou?r | Phù hợp với color hoặc colour |
[BW]ill[ieamy's]* | Phù hợp với Bill, Willy, William's, vv. |
[a-zA-Z]+ | Phù hợp với 1 hoặc nhiều chữ cái |
\d{3}-\d{2}-\d{4} | Phù hợp với một SSN |
[a-z]\w{1,7} | Phù hợp với một UW NetID |
⚡️ Greedy vs lazy
RegEX | Mô tả |
---|---|
* + {n,} (tham lam) | Phù hợp với nhiều nhất có thể |
<.+> | Tìm một kết quả lớn trong bold |
*? +? {n,}? (lười biếng) | Phù hợp với ít nhất có thể |
<.+?> | Tìm 2 kết quả trong bold |
⚡️ Phạm vi (Scope)
RegEX | Mô tả |
---|---|
\b | Đầu từ (kế bên ký tự không phải "từ") |
\bring | Từ bắt đầu bằng "ring", ví dụ ringtone |
ring\b | Từ kết thúc bằng "ring", ví dụ spring |
\b9\b | Phù hợp với chữ số đơn 9, không phải 19, 91, 99, vv. |
\b[a-zA-Z]{6}\b | Phù hợp với từ có 6 chữ cái |
\B | Không phải đầu từ |
\Bring\B | Phù hợp với springs và wringer |
^\d*$ | Toàn bộ chuỗi phải là số |
^[a-zA-Z]{4,20}$ | Chuỗi phải có từ 4-20 chữ cái |
^[A-Z] | Chuỗi phải bắt đầu bằng chữ cái in hoa |
[\.!?"')]$ | Chuỗi phải kết thúc bằng dấu chấm câu, dấu chấm than, dấu hỏi, dấu ngoặc đơn |
⚡️ Chỉnh sửa (Modifiers)
RegEX | Mô tả |
---|---|
(?i)[a-z]*(?-i) | Bật/Tắt không phân biệt chữ hoa và chữ thường |
(?s).*(?-s) | Phù hợp với nhiều dòng (gây ra . phù hợp với dòng mới) |
(?m)^.*;$(?-m) | ^ & $ phù hợp với dòng chứ không phải toàn bộ chuỗi |
(?x) | Chế độ #free-spacing, cho phép chú thích dòng mới bị bỏ qua |
(?-x) | Tắt chế độ free-spacing |
/regex/ismx | Chế độ sửa đổi cho toàn bộ chuỗi |
⚡️ Nhóm (Groups): Trình phân tích cố gắng mỗi lựa chọn nếu kết quả không khớp sau nhóm có thể dẫn đến quá trình theo dõi phức tạp.
RegEX | Mô tả |
---|---|
(in|out)put | Phù hợp với input hoặc output |
\d{5}(-\d{4})? | Mã zip Hoa Kỳ ("+ 4" không bắt buộc) |
⚡️ Tham chiếu ngược (Back references)
RegEX | Mô tả |
---|---|
(to) (be) or not \1 \2 | Phù hợp với to be or not to be |
([^\s])\1{2} | Phù hợp với không gian, sau đó cùng một ký tự hai lần nữa aaa, ... |
\b(\w+)\s+\1\b | Phù hợp với từ lặp lại |
⚡️ Nhóm không ghi lại (Non-capturing group): Sử dụng nhóm không ghi lại hoặc nhóm atomic khi có thể.
RegEX | Mô tả |
---|---|
on(?:click|load) | Nhanh hơn: on(click|load) |
⚡️ Nhóm nguyên tử (Atomic groups):
RegEX | Mô tả |
---|---|
(?>red|green|blue) | Nhanh hơn so với nhóm không ghi lại |
(?>id|identity)\b | Khớp với id, nhưng không phải là identity |
"id" được khớp, nhưng \b
thất bại sau nhóm nguyên tử, trình phân tích không lùi lại vào nhóm để thử lại 'identity'
Nếu các lựa chọn chồng lấn, sắp xếp từ dài đến ngắn.
⚡️ If-then-else
Khớp "Mr." hoặc "Ms." nếu từ "her" xuất hiện sau đó trong chuỗi
M(?(?=.*?\bher\b)s|r)\.
⚡️ Lookaround (Nhìn xung quanh)
RegEX | Mô tả |
---|---|
(?= ) | Nhìn về phía trước, nếu bạn có thể tìm thấy phía trước |
(?! ) | Nhìn về phía trước, nếu bạn không thể tìm thấy phía trước |
(?<= ) | Nhìn về phía sau, nếu bạn có thể tìm thấy phía sau |
(?<! ) | Nhìn về phía sau, nếu bạn không thể tìm thấy phía sau |
\b\w+?(?=ing\b) | Khớp với warbling, string, fishing, ... |
\b(?!\w+ing\b)\w+\b | Những từ KHÔNG kết thúc bằng "ing" |
(?<=\bpre).*?\b | Khớp với pretend, present, prefix, ... |
\b\w{3}(?<!pre)\w*?\b | Những từ KHÔNG bắt đầu bằng "pre" |
\b\w+(?<!ing)\b | Khớp với từ KHÔNG kết thúc bằng "ing" |
⚡️ Backreferences (Tham chiếu ngược): trong biểu thức chính quy là cách để ánh xạ lại (refer back) đến các nhóm con đã được chụp trước đó trong biểu thức. Dưới đây là một số ví dụ về cách sử dụng tham chiếu ngược:
(to) (be) or not \1 \2
: Khớp với "to be or not to be". Trong đó,\1
tham chiếu đến nhóm con đầu tiên(to)
, và\2
tham chiếu đến nhóm con thứ hai(be)
.([^\s])\1{2}
: Khớp với bất kỳ ký tự không phải khoảng trắng nào được lặp lại chính nó ít nhất 2 lần. Ví dụ, "aaa", "!!", "33".\b(\w+)\s+\1\b
: Khớp với bất kỳ từ nào được lặp lại khi có một khoảng trắng ở giữa. Ví dụ, "hello hello", "world world".
Lưu ý rằng việc sử dụng tham chiếu ngược có thể tăng cường khả năng xử lý và độ phức tạp của biểu thức chính quy, đặc biệt là khi có nhiều nhóm con được sử dụng.
3. RegEX trong Python
⚡️ Import module biểu thức chính quy trong Python
import re
Trong Python, thư viện re
được sử dụng để làm việc với biểu thức chính quy (regular expressions). Việc import thư viện này là bước cần thiết để có thể sử dụng các chức năng liên quan đến biểu thức chính quy trong ngôn ngữ lập trình Python.
⚡️ Các hàm liên quan đến biểu thức chính quy trong Python
RegEx | Mô Tả |
---|---|
re.findall | Trả về một danh sách chứa tất cả các kết quả khớp |
re.finditer | Trả về một iterable của các đối tượng Match (mỗi đối tượng cho một kết quả khớp) |
re.search | Trả về một đối tượng Match nếu có kết quả khớp bất kỳ nào trong chuỗi |
re.split | Trả về một danh sách nơi chuỗi đã được chia tại mỗi kết quả khớp |
re.sub | Thay thế một hoặc nhiều kết quả khớp bằng một chuỗi |
re.compile | Biên dịch một biểu thức chính quy để sử dụng sau này |
re.escape | Trả về chuỗi với tất cả các ký tự không phải chữ và số được thêm dấu gạch chéo (backslash) |
Lưu ý: Các hàm này là một phần của thư viện re
trong Python và được sử dụng để thực hiện các thao tác liên quan đến biểu thức chính quy.
⚡️ Cờ (Flags)
Cú Pháp | RegEx | Mô Tả |
---|---|---|
re.I | re.IGNORECASE | Bỏ qua sự phân biệt chữ hoa và thường |
re.M | re.MULTILINE | Đa dòng |
re.L | re.LOCALE | Biến \w, \b, \s phụ thuộc vào locale |
re.S | re.DOTALL | Dấu chấm (.) khớp với mọi thứ (bao gồm cả dòng mới) |
re.U | re.UNICODE | Biến \w, \b, \d, \s phụ thuộc vào Unicode |
re.X | re.VERBOSE | Kiểu định dạng đọc được |
⚡️ Ví dụ
>>> sentence = 'This is a sample string'
>>> bool(re.search(r'this', sentence, flags=re.I))
True
>>> bool(re.search(r'xyz', sentence))
False
>>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
['par', 'spar', 'spare', 'pare']
>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
['0501', '154', '98234']
>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
>>> [m[0] for m in m_iter if int(m[0]) < 350]
['45', '349', '4', '204']
>>> re.split(r'\d+', 'Sample123string42with777numbers')
['Sample', 'string', 'with', 'numbers']
>>> ip_lines = "catapults\nconcatenate\ncat"
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
* catapults
* concatenate
* cat
>>> pet = re.compile(r'dog')
>>> type(pet)
<class '_sre.SRE_Pattern'>
>>> bool(pet.search('They bought a dog'))
True
>>> bool(pet.search('A cat crossed their path'))
False
4. RegEx trong JavaScript
let textA = 'I like APPles very much';
let textB = 'I like APPles';
let regex = /apples$/i;
// Output: false
console.log(regex.test(textA));
// Output: true
console.log(regex.test(textB));
let text = 'I like APPles very much';
let regexA = /apples/;
let regexB = /apples/i;
// Output: -1
console.log(text.search(regexA));
// Output: 7
console.log(text.search(regexB));
let text = 'Do you like apples?';
let regex = /apples/;
// Output: apples
console.log(regex.exec(text)[0]);
// Output: Do you like apples?
console.log(regex.exec(text).input);
let text = 'Here are apples and apPleS';
let regex = /apples/gi;
// Output: [ "apples", "apPleS" ]
console.log(text.match(regex));
let text = 'This 593 string will be brok294en at places where d1gits are.';
let regex = /\d+/g;
// Output: [ "This ", " string will be brok", "en at places where d", "gits are." ]
console.log(text.split(regex));
let regex = /t(e)(st(\d?))/g;
let text = 'test1test2';
let array = [...text.matchAll(regex)];
// Output: ["test1", "e", "st1", "1"]
console.log(array[0]);
// Output: ["test2", "e", "st2", "2"]
console.log(array[1]);
let text = 'Do you like aPPles?';
let regex = /apples/i;
// Output: Do you like mangoes?
let result = text.replace(regex, 'mangoes');
console.log(result);
let regex = /apples/gi;
let text = 'Here are apples and apPleS';
// Output: Here are mangoes and mangoes
let result = text.replaceAll(regex, 'mangoes');
console.log(result);
5. RegEx trong PHP
⚡️ Các hàm liên quan đến biểu thức chính quy trong PHP
RegEx | Mô Tả |
---|---|
preg_match() | Thực hiện việc so khớp biểu thức chính quy |
preg_match_all() | Thực hiện so khớp biểu thức chính quy toàn cầu |
preg_replace_callback() | Thực hiện tìm kiếm và thay thế biểu thức chính quy sử dụng một hàm gọi lại |
preg_replace() | Thực hiện tìm kiếm và thay thế biểu thức chính quy |
preg_split() | Chia một chuỗi bằng biểu thức chính quy |
preg_grep() | Trả về các mục trong mảng khớp với một mẫu |
Lưu ý: Các hàm này được sử dụng trong ngôn ngữ lập trình PHP để thao tác với biểu thức chính quy.
$str = "Visit Microsoft!";
$regex = "/microsoft/i";
// Output: Visit QuickRef!
echo preg_replace($regex, "QuickRef", $str);
$str = "Visit QuickRef";
$regex = "#quickref#i";
// Output: 1
echo preg_match($regex, $str);
$arr = ["Jane", "jane", "Joan", "JANE"];
$regex = "/Jane/";
// Output: Jane
echo preg_grep($regex, $arr);
$regex = "/[a-zA-Z]+ (\d+)/";
$input_str = "June 24, August 13, and December 30";
if (preg_match_all($regex, $input_str, $matches_out)) {
// Output: 2
echo count($matches_out);
// Output: 3
echo count($matches_out[0]);
// Output: Array("June 24", "August 13", "December 30")
print_r($matches_out[0]);
// Output: Array("24", "13", "30")
print_r($matches_out[1]);
}
$str = "Jane\tKate\nLucy Marion";
$regex = "@\s@";
// Output: Array("Jane", "Kate", "Lucy", "Marion")
print_r(preg_split($regex, $str));
6. RegEx trong Java
⚡️ Styles
Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");
boolean s1 = m.matches();
System.out.println(s1); // Outputs: true
boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2); // Outputs: true
boolean s3 = Pattern.matches(".s", "XXXX");
System.out.println(s3); // Outputs: false
⚡️ Các Trường Pattern
RegEx | Mô Tả |
---|---|
CANON_EQ | Tương đương Canon |
CASE_INSENSITIVE | So sánh không phân biệt chữ hoa chữ thường |
COMMENTS | Cho phép dấu cách và ghi chú |
DOTALL | Chế độ Dotall |
MULTILINE | Chế độ Multiline |
UNICODE_CASE | Folding chữ theo Unicode |
UNIX_LINES | Chế độ Unix lines |
⚡️ Các phương thức (methods)
Pattern
Pattern compile(String regex [, int flags])
: Biên dịch biểu thức chính quy thành đối tượngPattern
.boolean matches([String regex, ] CharSequence input)
: Kiểm tra xem biểu thức chính quy có khớp với chuỗi đầu vào không.String[] split(String regex [, int limit])
: Chia chuỗi thành mảng con dựa trên biểu thức chính quy.String quote(String s)
: Trả về một phiên bản chuỗi làm cho bất kỳ ký tự đặc biệt nào trong chuỗi trở thành chuỗi mẫu đơn giản.
Matcher
int start([int group | String name])
: Trả về vị trí bắt đầu của phù hợp của nhóm hoặc tên xác định.int end([int group | String name])
: Trả về vị trí kết thúc của phù hợp của nhóm hoặc tên xác định.boolean find([int start])
: Tìm sự khớp tiếp theo của biểu thức chính quy trong chuỗi.String group([int group | String name])
: Trả về phần của chuỗi phù hợp với nhóm hoặc tên xác định.Matcher reset()
: Đặt lại matcher để bắt đầu lại từ đầu.
String
boolean matches(String regex)
: Kiểm tra xem chuỗi có khớp với biểu thức chính quy không.String replaceAll(String regex, String replacement)
: Thay thế tất cả các phù hợp của biểu thức chính quy trong chuỗi bằng chuỗi thay thế.String[] split(String regex[, int limit])
: Chia chuỗi thành mảng con dựa trên biểu thức chính quy.
Còn nhiều phương thức khác nữa...
⚡️ Ví dụ
String regex = "[A-Z\n]{5}$";
String str = "I like APP\nLE";
Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);
// Outputs: I like Apple!
System.out.println(m.replaceAll("pple!"));
String str = "She sells seashells by the Seashore";
String regex = "\\w*se\\w*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
List<String> matches = new ArrayList<>();
while (m.find()) {
matches.add(m.group());
}
// Outputs: [sells, seashells, Seashore]
System.out.println(matches);
7. RegEX trong MySQL
⚡️ Các hàm liên quan đến biểu thức chính quy trong MySQL
Hàm | Mô tả |
---|---|
REGEXP | Kiểm tra xem chuỗi có khớp với biểu thức chính quy không |
REGEXP_INSTR() | Trả về vị trí bắt đầu của chuỗi con khớp với biểu thức chính quy (Lưu ý: Chỉ MySQL 8.0+) |
REGEXP_LIKE() | Kiểm tra xem chuỗi có khớp với biểu thức chính quy không (Lưu ý: Chỉ MySQL 8.0+) |
REGEXP_REPLACE() | Thay thế chuỗi con khớp với biểu thức chính quy (Lưu ý: Chỉ MySQL 8.0+) |
REGEXP_SUBSTR() | Trả về chuỗi con khớp với biểu thức chính quy (Lưu ý: Chỉ MySQL 8.0+) |
-- expr REGEXP pat
mysql> SELECT 'abc' REGEXP '^[a-d]';
1
mysql> SELECT name FROM cities WHERE name REGEXP '^A';
mysql> SELECT name FROM cities WHERE name NOT REGEXP '^A';
mysql> SELECT name FROM cities WHERE name REGEXP 'A|B|R';
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
1 0
-- REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
a X c
mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
abc X
-- REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
abc
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
ghi
-- REGEXP_LIKE(expr, pat[, match_type])
mysql> SELECT regexp_like('aba', 'b+')
1
mysql> SELECT regexp_like('aba', 'b{2}')
0
mysql> # i: case-insensitive
mysql> SELECT regexp_like('Abba', 'ABBA', 'i');
1
mysql> # m: multi-line
mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
1
-- REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
2
mysql> SELECT regexp_instr('abba', 'b{2}', 2);
2
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
5
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
7