Lớp & ký Tự (Character classes)
Giả sử chúng ta có một số điện thoại như thế này:"+84(90)123.4567"
, và chúng ta cần biến nó thành các số thuần túy 0901234567
Để làm như vậy chúng ta sẽ xóa bất cứ thứ gì không phải số.
Ví dụ: Tìm chữ số đầu tiền trong số điện thoại: (không có cờ g)
let str = "+84(90)123.4567";
let regexp = /\d/;
alert( str.match(regexp) ); // 8
Ví dụ: Có cờ g
let str = "+84(90)123.4567";
let regexp = /\d/g;
alert( str.match(regexp) ); // mảng có các phần tử : 8,4,9,0,1,2,3,4,5,6,7
//dùng hàm join để nối mảng
alert( str.match(regexp).join('') ); // 84901234567
ĐỌC NHANH QUA BẢNG BIỂU THỨC SAU TRƯỚC KHI TIẾP CÁC VÍ DỤ
STT | Biểu thức | Mô tả | Ghi chú |
---|---|---|---|
01 | a|b | Khớp với a hoặc b | |
02 | [0-9] | Khớp với một trong số từ 0 tới 9 | |
03 | [a-z] | Khớp với một trong chữ từ a tới z | |
04 | [abc] | Có thể khớp với a, b hoặc c | |
05 | [^abc] | Khớp với bất kì kí tự nào ngoài a, b và c | Nếu ^ xuất hiện đầu tiên sau ngoặc vuông, nó có nghĩa là phủ định |
06 | \d | Số bất kì | Tương dương với [0-9] |
07 | \D | Không phải là số | Tương dương với [^0-9] |
08 | \s | là khoảng trắng | |
09 | \S | Không phải khoảng trắng | Tương dương với [^\s] |
10 | \S+ | Không phải khoảng trắng tiếp đó (+) là 1 dãy không phải khoảng trắng | Một hoặc một số |
11 | \w | Kí tự chữ và chữ số kèm dấu rạch chân | Đối với ASCII, các ký tự từ là
|
12 | \W | Ngoài bảng chữ cái | Tương dương với [^\w] |
13 | \b | Ranh giới của từ, tức là đầu từ hoặc cuối từ. | Ví dụ: \bcat\b khớp với từ "cat" trong chuỗi đầu vào. |
4.2 Ký tự đặc biệt
TT | Biểu thức | Mô tả | Ghi chú |
---|---|---|---|
14 | . | Bất kỳ ký tự nào ngoại trừ xuống dòng | |
15 | ^ | Bắt đầu của từ | |
16 | $ | Kết thúc của từ | |
17 | / | Bắt đầu hoặc kết thúc chuỗi regex | |
18 | | | Sủ dụng tương đương phép or | Hay dùng trong cặp ngoặc tròn |
19 | \ | \b => \ký tự thường \* => \ký tự đặc biệt | VD: \b b sẽ trở thành nhóm đặc biệt, \* thì * sẽ trở thành kí tự thường là * chứ không phải là lặp lại |
4.3 Lặp
STT | Biểu thức | Mô tả | Ghi chú |
---|---|---|---|
20 | * | Xuất hiện 0 hoặc nhiều lần | viết ngắn gọn cho {0,} |
21 | + | Xuất hiện 1 hoặc nhiều lần | viết ngắn gọn cho {1,} |
22 | ? | Xuất hiện 0 hoặc 1 lần | viết ngắn gọn cho {0,1} |
23 | {X} | Xuất hiện X lần | X không phải số âm |
24 | {X,Y} | Xuất hiện trong khoảng X tới Y lần | X,Y không phải số âm |
25 | ? | có nghĩa là xuất hiện 0 hoặc nhiều lần, thêm ? phía sau nghĩa là tìm kiếm khớp nhỏ nhất |
4.4 Khớp nhóm
STT | Biểu thức | Mô tả | Ghi chú |
---|---|---|---|
26 | () | Khớp với một nhóm các kí tự đồng thời nhớ kết quả khớp | Ví dụ (e|g)mail sẽ khớp với email hoặc gmail. /(ab) (cd) \1 \2/ sẽ khớp với “ab cd ab cd” |
27 | (?:x) | Khớp với x nhưng không nhớ kết quả khớp | “foo foo” sẽ khớp với /(foo) \1/ chứ không khớp với (?:foo) \1 |
28 | x(?=y) | Chỉ khớp x nếu ngay sau x là y | “hello” sẽ khớp với /h(?=e)/ nhưng kết quả trả về chỉ có h |
29 | x(?!y) | Chỉ khớp x nếu ngay sau x không phải là y |
Ví dụ:
Một regexp có thể chứa cả ký hiệu thông thường và các lớp ký tự.
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
Ngoài ra, chúng ta có thể sử dụng nhiều lớp ký tự:
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
Đối sánh (mỗi lớp ký tự regexp có ký tự kết quả tương ứng):
inverse-classes (lớp nghịch đảo)
Đối với mỗi lớp ký tự tồn tại một “lớp nghịch đảo”, được biểu thị cùng một chữ cái, nhưng viết hoa.
Lớp \D
\D
Ngịch đảo của \d (là chữ số digit number) => không phải digit number)
\S
không phải là khoảng trắng (space) \s ( là khoảng trắng)
\W
không phải là một từ (word +number [a-zA-Z-0-9_]) \w (là chữ cái)
Dùng match
let str = "+84(90)123.4567";
alert( str.match(/\d/g).join('') ); // 84901234567
Dùng replace ( \D không phải digit number)
let str = "+84(90)123.4567";
alert( str.replace(/\D/g, "") ); // 84901234567 -- tìm kiếm và lặp (không phải chữ số - global sang rỗng)
.Dấu chấm . là “bất kỳ ký tự nào”
alert( "Z".match(/./) ); // Z
Dấu . ở giữa regexp:
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (space is also a character)
.Lưu ý: dấu châm bắt buộc phải có 1 ký tự nếu không sẽ báo lỗi
alert( "CS4".match(/CS.4/) ); // null, không khớp vì không có ký tự nào cho dấu chấm
2 trường hợp dấu chấm kết hợp với cờ s và không cờ (space)
alert( "A\nB".match(/A.B/) ); // null (no match)
alert( "A\nB".match(/A.B/s) ); // A\nB (match!)
Trường Hợp với khoảng trắng
//trường hợp lỗi
alert( "1 - 5".match(/\d-\d/) ); // null, no match!
//trường hợp làm việc
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, now it works
// hoặc bạn có thể sử dụng regexp \s
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, also works
khoảng