| | RegExp

Function RegExp trong JavaScript

@
Function RegExp trong JavaScript là function đại diện cho đối tượng Regular Expressions, ví dụ: /./, /abc/g,…, Regular Expressions là các mẫu kí tự dùng để tìm kiếm các kí tự được kết hợp với nhau trong các chuỗi (String).
Trong JavaScript đối tượng RegExp được sử dụng trong các function prototype của nó là testexec,… và sử dụng trong các function prototype của Function String như: split, search,… replace.

Tạo một đối tượng RegExp:
Có 2 cách để tạo một đối tượng RegExp:
var a = /abc/flags;
//phía trên là cách thường được sử dụng, nhưng bạn không thể đưa các biến vào đây

var b = new RegExp('abc', flags);
//cách trên có thể đưa các biến vào function để tạo ra đối tượng RegExp mới

Lưu ý: flags ở phía trên là một chuỗi các tùy chọn chứa các kí tự là "g", "i", "m" và "y" mà xác định tương ứng với: g Global (so khớp tất cả chuỗi), i Không phân biệt kiểu chữ (IN HOA hay in thường), m multiline matches (so khớp đa dòng), y….
Bạn có thể để trống flags nếu bạn không cần các giá trị của nó.


Flags và giá trị sử dụng của nó:
  • g
  • Tìm kiếm toàn cục (so khớp tất cả chuỗi).
  • i
  • Thực hiện so khớp không phân biệt kiểu chữ (IN HOA hay in thường).
  • m
  • Multiline matches (so khớp đa dòng).
  • y
  • Thực thi một tìm kiếm “dính” - so khớp được bắt đầu ở vị trí hiện tại trong chuỗi mục tiêu.

Danh sách kí tự đặc biệt dùng trong đối tượng Regular Expressions:
Thao khảo nguồn: Biểu thức chính quy
  • \
  • Một dấu gạch chéo ngược sẽ biến một kí tự thường liền kế phía sau thành một kí tự đặc biệt, tức là nó không được sử dụng để tìm kiếm thông thường nữa. ví dụ: kí tự d bình thường sẽ so khớp với các kí tự d, nhưng nếu có dấu gạch chéo ngược đằng trước \d thì nó sẽ so khớp với các kí tự 0-9.

    Nhưng nếu nó đứng trước một ký tự đặc biệt thì ký tự đặc biệt đó sẽ trở thành một ký tự bình thường, ví dụ \^ sẽ so khớp với kí tự ^.
  • ^
  • Khớp các kí tự đứng đầu một chuỗi. Nếu có flags m thì nó còn khớp được cả các kí tự đứng đầu của mỗi dòng (sau kí tự xuống dòng).
    Ví dụ: /^o/ sẽ khớp với chuỗi 'onjs' nhưng không khớp với chuỗi 'json'.

    Ý nghĩa của nó sẽ thay đổi khi nó là kí tự đầu tiên trong ngoặc vuông: []
  • $
  • So khớp ở cuối chuỗi. Nếu có flags m (đa dòng), nó sẽ khớp ngay trước kí tự xuống dòng.

    Ví dụ, /a$/ không khớp với chuỗi 'nhanh' nhưng khớp với chuỗi 'nha'.
  • *
  • Cho phép kí tự trước nó lặp lại 0 hoặc nhiều lần, tương tự với cách viết {0,}.
    Ví dụ: /onj*s/ khớp với chuỗi 'onjjjjs' và chuỗi 'ons'.
  • +
  • Cho phép kí tự trước nó lặp lại 1 hoặc nhiều lần, tương tự với cách viết {1,}.
    Ví dụ: /onj+s/ khớp với chuỗi 'onjjjjs' và chuỗi 'onjs'.
  • ?
  • Cho phép kí tự trước nó lặp lại 0 lần hoặc 1 lần duy nhất, tương tự với cách viết {0,1}.

    Nếu sử dụng kí tự này ngay sau bất kì kí tự định lượng nào trong số *,+,? hay {}, đều làm bộ định lượng “chán ăn” (dừng so khớp ngay khi tìm được kí tự phù hợp),
    Ví dụ, áp dụng biểu mẫu /\d+/ cho chuỗi '123abc' ta được '123'. Nhưng áp dụng /\d+?/ cho chuỗi '123abc' ở trên ta chỉ nhận được kết quả là '1';

    Bạn có thể đọc thêm bên dưới các mục: x(?=y) và x(?!y).
  • .
  • Dấu . khớp với bất kì kí tự đơn nào ngoại trừ kí tự xuống dòng: '\n|\r'.

    Ví dụ, /.js/ khớp với chuỗi 'onjs', nhưng không khớp với chuỗi '\njs'.
  • (x)
  • Khớp 'x' và nhớ kết quả so khớp này, như ví dụ ở dưới. Các dấu ngoặc tròn được gọi là các dấu ngoặc có nhớ.

    Ví dụ biểu mẫu: /(on) (js)/ sẽ khớp từ 'on' và từ 'js' trong chuỗi 'on js on', và nhớ kết quả so khớp.
    Các từ: \1, \2, \n hoặc $1, $2, $n… là kế thừa cho các từ được nhớ ở phía trên.

    Ví dụ: '69 on Js'.replace(/(on) (Js)/, '$2 $1') sẽ đảo vị trí 2 từ 'on' và 'Js' cho nhau.
  • (?:x)
  • Khớp 'x' nhưng không nhớ kết quả so khớp. Những dấu ngoặc tròn (?:) được gọi là những dấu ngoặc không nhớ, nó sẽ không nhớ kết quả so khớp bên trong ngoặc tròn.

    Thêm nữa: Xem xét biểu thức đơn giản /(?:foo){1,2}/, nếu biểu thức này được viết là /foo{1,2}/, {1,2} sẽ chỉ áp dụng cho kí tự 'o' ở cuối chuỗi 'foo'. Với những dấu ngoặc không nhớ, {1,2} sẽ áp dụng cho cả cụm 'foo'.
  • x(?=y)
  • Chỉ khớp 'x' nếu 'x' theo sau bởi 'y'.
    Ví dụ: /on(?=js)/ chỉ khớp với từ on nếu đằng sau nó là từ js, tuy nhiên từ “js“ sẽ không phải là một phần của kết quả so khớp,

    Ví dụ: 'onjs'.replace(/on(?=js)/, '@@') sẽ cho ra kết quả là: @@js.
  • x(?!y)
  • Chỉ khớp 'x' nếu 'x' không được theo sau bởi 'y'. và 'y' cũng không phải là một phần của kết quả so khớp.
  • x|y
  • Khớp với 'x' hoặc 'y',

    ví dụ: /on|js/ khớp với cả chuỗi 'on' và chuỗi 'js'.
  • {n}
  • Kí tự đứng trước phải xuất hiện n lần và n phải là số nguyên dương.

    Ví dụ: /j{2}/ sẽ khớp với chuỗi 'onjjs' nhưng không khớp với chuỗi 'onjs'.
  • {n,m}
  • Kí tự đứng trước phải xuất hiện từ n đến m lần. n và m là số nguyên dương và n <= m. Nếu m bị bỏ qua, nó tương đương như ∞ (Infinity).
  • [xyz]
  • Lớp kí tự. Loại mẫu này dùng để so khớp với một kí tự bất kì trong dấu ngoặc vuông, bao gồm cả “escape sequences”. Trong lớp kí tự, dấu chấm (.) và (*) không còn là kí tự đặc biệt nên ta không cần kí tự thoát (\) đứng trước nó. Bạn có thể chỉ định một khoảng kí tự bằng cách sử dụng một kí tự gạch nối (-) như trong ví dụ dưới đây:

    [a-d] sẽ tương đương với [abcd], [6-9] sẽ tương đương với [6789].
  • [^xyz]
  • Lớp kí tự phủ định. Khi kí tự ^ đứng đầu tiên trong dấu ngoặc vuông, nó phủ định mẫu kí tự này.

    Ví dụ: /[^0-3]+/ sẽ khớp với '45' trong chuỗi '12345';
  • [\b]
  • Khớp với kí tự dịch lùi - backspace (U+0008). Bạn phải đặt trong dấu ngoặc vuông nếu muốn so khớp một kí tự dịch lùi. (Đừng nhầm lẫn với mẫu \b).
  • \b
  • Khớp với kí tự biên. Kí tự biên là một kí tự giả, nó khớp với vị trí mà một kí tự không được theo sau hoặc đứng trước bởi một kí tự khác. Tương đương với mẫu (^\w|\w$|\W\w|\w\W). Lưu ý rằng một kí tự biên được khớp sẽ không bao gồm trong kết quả so khớp. Nói cách khác, độ dài của một kí tự biên là 0. (Đừng nhầm lẫn với mẫu [\b]).

    Ví dụ:
    /\bm/ khớp với 'm' trong chuỗi "moon";
    /oo\b/ không khớp 'oo' trong chuỗi "moon", bởi vì 'oo' được theo sau bởi kí tự 'n';

    Chú ý: biểu thức chính quy trong Javascript định nghĩa một lớp kí tự là những kí tự thường. Bất kỳ kí tự nào không thuộc lớp kí tự thường như trên, ví dụ như: "é" hay "ü" bị xem như một kí tự ngắt.
  • \B
  • Khớp với kí tự không phải kí tự biên. Mẫu này khớp tại vị trí mà kí tự trước và kí tự sau nó cùng kiểu: hoặc cả hai là kí tự hoặc cả hai không phải là kí tự. Bắt đầu và kết thúc chuỗi không được xem là những kí tự.
  • \cX
  • X là một kí tự trong khoảng A tới Z. Mẫu này khớp với một kí tự điều khiển trong một chuỗi.

    Ví dụ: /\cM/ khớp với control-M (U+000D) trong chuỗi.
  • \d
  • Khớp với một kí tự số. Tương đương với mẫu [0-9].
  • \D
  • Khớp với một kí tự không phải là kí tự số. Tương đương với mẫu [^0-9].
  • \w
  • Khớp với tất cả kí tự là chữ, số và gạch dưới. Tương đương với mẫu [A-Za-z0-9_].
  • \W
  • Khớp với tất cả kí tự không phải là chữ, số và gạch dưới. Tương đương với mẫu [^A-Za-z0-9_].
  • \f
  • Khớp với kí tự phân trang - form feed (U+000C).
  • \n
  • Khớp với kí tự xuống dòng - line feed (U+000A).
  • \r
  • Khớp với kí tự quay đầu dòng - carriage return (U+000D).
  • \s
  • Khớp với một kí tự khoảng trắng, bao gồm trống - space, tab, phân trang - form feed, phân dòng - line feed. Tương đương với [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​\u3000].
  • \S
  • Khớp với một kí tự không phải khoảng trắng. Tương đương với [^\s].
  • \t
  • Khớp với kí tự tab (U+0009).
  • \v
  • Khớp với kí tự vertical tab (U+000B).
  • \n
  • Trong đó, n là một số nguyên dương > 0, một tham chiếu ngược tới chuỗi khớp thứ n trong biểu thức (đếm từ trái sang, bắt đầu bằng 1).

    ví dụ, /apple(,)\sorange\1/ hay /apple(,)\sorange,/ khớp với 'apple, orange,' trong chuỗi "apple, orange, cherry, peach."
  • \0
  • Khớp với kí tự NULL (U+0000). Lưu ý: không được thêm bất kì một kí tự số nào sau số 0, vì \0<number> là một biểu diễn hệ bát phân escape sequence.
  • \xhh
  • Khớp với kí tự với mã code là hh (2 số trong hệ thập lục phân).
  • \uhhhh
  • Khớp với kí tự có mã hhhh (4 số trong hệ thập lục phân).

Prototype của function RegExp:
  • constructor
  • Trả lại: function RegExp
  • global
  • Kiểm tra xem đối tượng RegExp có flags g hay không, nếu có trả lại true, nếu không trả lại false.

    Ví dụ: /abc/g.global == true.
  • ignoreCase
  • Kiểm tra xem đối tượng RegExp có flags i hay không, nếu có trả lại true, nếu không trả lại false.
  • multiline
  • Kiểm tra xem đối tượng RegExp có flags m hay không, nếu có trả lại true, nếu không trả lại false.
  • sticky
  • Kiểm tra xem đối tượng RegExp có flags y hay không, nếu có trả lại true, nếu không trả lại false.
  • source
  • Trả lại chuỗi bên trong đối tượng RegExp, ví dụ: /abc/.source == 'abc'.
  • toString()
  • Chuyển đối tượng RegExp sang dạng chuỗi văn bản, ví dụ: /abc/.toString() == '/abc/'.
  • lastIndex
  • Xác định chỉ mục tại đó bắt đầu một so khớp mới, và cũng trả lại chỉ mục cuối cùng được so khớp.
  • exec(s)
  • Trả lại một Array chứa các phần tử lấy từ biến s nếu đối tượng RegExp so khớp với chuỗi truyền vào biến s, nếu không trả lại null, hàm này gần giống với “function match của String“ nhưng flags g không có tác dụng với hàm này.
  • test(s)
  • Trả lại true nếu đối tượng RegExp so khớp với chuỗi truyền vào biến s, nếu không trả lại false.

Ví dụ với prototype. lastIndex, lastIndex xác định chỉ mục tại đó bắt đầu một so khớp mới, và cũng trả lại chỉ mục cuối cùng được so khớp.
Lưu ý: nó chỉ làm việc với đối tượng RegExp có flags g hoặc flags y.
var a = 'abc abc';
var b = /abc/g;
b.test(a);
// true
b.lastIndex;
// 3
b.test(a);
// true
b.lastIndex;
// 7
b.test(a);
// false
b.lastIndex;
// 0

var c = /abc/g;
c.lastIndex = 7;
c.test(a);
// false

Ví dụ với prototype. exec:
var a = 'onjs.me';
var b = /[a-z]+/;
b.exec(a);
//Array ['onjs']
var c = /([a-z]+)(.+)/;
c.exec(a);
//Array ['onjs.me', 'onjs', '.me']
var d = /[A-Z]+/;
d.exec(a);
// null

Ví dụ với prototype. test:
var a = 'onjs.me';
var b = /[a-z]+/;
b.test(a);
// true
var c = /[A-Z]+/;
c.exec(a);
// false
var d = /[A-Z]+/i;
d.exec(a);
// true

Xêm thêm các ví dụ sử dụng RegExp:

Function String: prototype phần 2

  this.alter   ·   0   ·  
😂Smileys List   ·   ×