Tìm hiểu về Regular Expressions
Regular Expression hay còn gọi là biểu thức chính quy được dùng để xử lý chuỗi nâng cao thông qua biểu thức riêng của nó, những biểu thức này sẽ có những nguyên tắc riêng và bạn phải tuân theo nguyên tắc đó thì biểu thức của bạn mới hoạt động được. Ngoài cái tên gọi Regular Expression ra thì nó còn có thể viết tắt thành RegEx. Hiểu đơn giản Regex là cách để diễn tả một đoạn mẫu phức tạp dùng đẻ tìm kiếm bằng một chuỗi, ví dụ như bạn có thể check một chuỗi bao gồm chữ hoặc số, kiểm tra số lượng ký tự, lấy ra chuỗi theo chuẩn cho trước.
Regex có thể sử dụng được trong hầu hết các ngôn ngữ, để học Regex cơ bản thì khá đơn giản, bạn chỉ cần học những expression cơ bản rồi kết hợp chúng lại với nhau. Các bạn có thể vào trang https://regex101.com để tìm hiểu và thử ngay đoạn regex mình viết.
Một số cú pháp Regular expression:
-
‘.‘
-
‘$‘
-
Khớp
với ký tự cuối chuỗi(ký tự giả định được thêm
vào cuối mỗi chuỗi hoặc trước ký tự newline trong
trường hợp chuỗi có nhiều dòng). Ví dụ biểu thức
‘foo‘
sẽ khớp với cả hai chuỗi ‘foo’ và ‘foobar’ trong
khi biểu thức ‘foo$‘
chỉ khớp với chuỗi ‘foo’ mà không khớp với chuỗi
‘foobar’ nữa.
-
‘*‘
-
làm
cho biểu thức chính quy khớp với 0 hoặc nhiều lần
lặp lại của biểu thức chính quy được định nghĩa
trước nó, càng nhiều lần lặp lại càng tốt. Ví dụ
biểu thức ‘ab*‘
sẽ khớp với ‘a’, ‘ab’ hoặc ‘a’ theo sau bởi
bất kỳ số chữ cái ‘b’ nào.
-
‘+‘
-
Làm
cho biểu thức chính quy khớp với 1 hoặc nhiều lần
lặp lại của biểu thức chính quy được định nghĩa
trước nó. Ví dụ ‘ab+‘
sẽ khớp với ‘a’ theo sau bởi bất kỳ số chữ cái
‘b’ nào(khác 0, tức là chữ b xuất hiện ít nhất 1
lần), và nó không khớp với chuỗi ‘a’ nữa.
-
‘?‘
-
làm
cho biểu thức chính quy khớp với 0 hoặc 1 lần lặp
lại của biểu thức chính quy được định nghĩa trước
đó. Ví dụ ab? sẽ
khớp với chuỗi ‘a’ hoặc ‘ab’.
-
‘*?‘,
‘+?‘,
‘??‘
-
Ký
tự ‘*‘,
‘+‘
và ‘?‘
là các ký tự tham lam, chúng sẽ khớp với chuỗi dài
nhất có thể. Đôi khi hành vi này là không mong muốn,
nêu biểu thức ‘<.*>‘
được so khớp với chuỗi ‘<a> b <c>’, nó
sẽ khớp với toàn bộ chuỗi(nhưng ta lại chỉ muốn
tìm ra chuỗi ‘<a>’ và ‘<c>’). Thêm dấu
‘?‘
vào sau chúng sẽ giải quyết được vấn đề này. Nó
sẽ tìm ra chuỗi khớp với mẫu với ít ký tự nhất
có thể. Sử dụng ‘<.*?>‘
sẽ chỉ khớp với chuỗi ‘<a>’.
-
‘{m}‘
-
chỉ
định rằng chính xác m bản sao của biểu thức chính
quy được định nghĩa trước đó được lặp lại, ít
hơn sẽ không khớp. Ví dụ, ‘a{6}‘
sẽ khớp với chính xác 6 ký tự ‘a’, chuỗi có 5 ký
tự ‘a’ sẽ không khớp.
-
‘{m,n}‘
-
chỉ
định rằng biểu thức chính quy sẽ khớp với m đến n lần
lặp lại của biểu thức chính quy được định nghĩa
trước đó, có gắng khớp nhiều nhất có thể. Ví dụ
‘a{3,5}‘
sẽ khớp với chuỗi từ 3 đến 5 ký tự ‘a’. Nếu
bỏ qua m,
nó sẽ mặc định là 0, còn n mặc
định là vô hạn. Ví dụ ‘a{4,}b‘
sẽ khớp với ‘aaaab’ hoặc một nghìn ký tự ‘a’
theo sau là ký tự ‘b’.
-
‘{m,n}?‘
-
Đây
là phiên bản không tham lam của biểu thức trước, chỉ
định rằng biểu thức chính quy sẽ khớp với m đến n lần
lặp lại của biểu thức chính quy được định nghĩa
trước đó, có
gắng khớp ít nhất có thể.
Ví dụ trong chuỗi 6 ký tự ‘a’, biểu thức ‘a{3,5}‘
sẽ khớp với 5 ký tự ‘a’ trong khi biểu thức
‘a{3,5}?‘
chỉ khớp với 3 ký tự ‘a’.
-
‘\‘
-
Đây
có thể là ký tự với nhãn không phải ký tự đặc
biệt(cho phép bạn coi các ký tự ‘*?.‘
như các ký tự thông thường) hoặc là sự bắt đầu
cho một ký tự đặc biệt, ví dụ ‘\n,
\t‘.
-
‘[…]‘
-
Được
sử dụng để thể hiện tập các ký tự.
Các ký tự có thể được liệt kê riêng lẻ. Ví dụ ‘[akm]‘ sẽ khớp với ký tự ‘a’ hoặc ‘k’ hoặc ‘m’.
Có thể liệt kê bằng 1 khoảng các ký tự, giữa ký tự bắt đầu và kết thúc cách nhau bởi dấu ‘–‘. Ví dụ ‘[a-z]‘ sẽ khớp với tất cả các ký tự viết thường từ ‘a’ tới ‘z’. ‘[0-5][0-9]‘ sẽ khớp với tất cả các số có 2 chữ số trong khoảng từ 00 đến 59. Nếu bạn thực sự muốn liệt kê ký tự ‘–‘ trong tập hợp thì hãy nhớ lại cách dùng dấu ‘\‘ (sử dụng biểu thức ‘[a-z]‘) hoặc thêm dấu ‘–‘ vào đầu hoặc cuối tập hợp(‘[a-]‘).
Các ký tự đặc biệt trong dấu ‘[]‘ sẽ được coi như ký tự thông thường. Ví dụ ‘[(+*)]‘ sẽ khớp với bất kỳ ký tự ‘(‘, ‘+‘ hoặc ‘)‘ nào.
-
‘|‘
-
‘A|B‘,
trong đó A và B là các biểu thức chính quy tùy ý. Đây
là một biểu thức chính quy khớp với các chuỗi khớp
với biểu thức A hoặc B. Số lượng bất kỳ các biểu
thức chính quy có thể được phân cách nhau theo cách
này. Nó như phép toán OR trong
số học.
-
‘(…)‘
-
Khớp
với bất kỳ biểu thức chính quy nào bên trong dấu
ngoặc đơn. Nó cũng là ký hiệu cho biết điểm bắt
đầu và kết thúc của một nhóm. Các giá trị khớp
với biểu thức trong cặp dấu ngoặc đơn được lưu
lại và có thể được sử dụng lại sau này.
-
Các
ký tự đặc biệt được bắt đầu bởi dấu ‘\‘:
-
‘\number‘
-
khớp
với nội dung của nhóm được đánh số. Ví dụ,
‘(.+)\1‘
khớp với chuỗi ‘the the’ thì ‘\1‘
sẽ có giá trị là chuỗi ‘the the’. Các chuỗi được
đánh số từ 1 tới 99.
-
‘\A‘
-
chỉ
khớp với giá trị đầu chuỗi
-
‘\b‘
-
khớp
với chuỗi rỗng, nhưng chỉ ở đầu hoặc cuối của
một từ. Một từ được định nghĩa là một chuỗi
các ký tự chữ, số hoặc dấu gạch dưới. Do đó, kết
thúc của một từ có thể được biểu thị bằng dấu
khoảng trắng hoặc ký tự không phải chữ, số và dấu
gạch dưới. ‘\b‘
được định nghĩa là ranh giới giữa một ‘\w‘
và một ‘\W‘(hoặc
ngược lại) hoặc giữa ‘\w‘
với ký tự bắt đầu/ kết thúc của một chuỗi. Ví
dụ, ‘r’\bfoo\b’‘
sẽ khớp với ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo
baz’ nhưng không khớp với ‘foobar’ hoặc ‘foo3’.
-
‘\B‘
-
khớp
với chuỗi rỗng, nhưng chỉ khi nó không đứng ở vị
trí bắt đầu hoặc kết thúc 1 từ. Điều này có nghĩa
là ‘r’py\B’‘
khớp với chuỗi ‘python’, ‘python3’, ‘py2’ nhưng
không khớp với ‘py.’, ‘py’ hoặc ‘py!’. Đây là
trường hợp đối nghịch với ‘\b‘.
-
‘\d‘
-
khớp
với bất kỳ chữ số thập phân nào, tương đương với
‘[0-9]‘
-
‘\D‘
-
Khớp
với bất kỳ ký tự không phải chữ số nào, tương
đương với tập hợp ”[^0-9]”
-
‘\s‘
-
khớp
với bất kỳ ký tự khoảng trắng nào, tương đương
với tập hợp ‘[\t\n\r\f\v]‘
-
‘\S‘
-
khớp
với bất kỳ ký tự nào không phải khoảng trắng,
tương đương với tập hợp ‘[^\t\n\r\f\v]‘
-
‘\w‘
-
khớp
với bất kỳ ký tự chữ, số nào và dấu gạch dưới,
điều này tương đương với tập hợp ‘[a-zA-Z0-9_]‘.
-
‘\W‘
-
khớp
với bất kỳ ký tự không phải chữ, số nào và dấu
gạch dưới, điều này tương đương với tập hợp ‘[^
a-zA-Z0-9_]‘
-
‘\Z‘
-
chỉ
khớp với giá trị cuối chuỗi.
Ví
dụ 1: lấy địa chỉ URL :
Ví
dụ 2: Lấy email từ chuỗi:
Ví
dụ 3: Xóa bỏ console.log() từ file js:
Nhận xét
Đăng nhận xét