RegExp.prototype[Symbol.match]()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Phương thức [Symbol.match]() của các instance RegExp xác định cách String.prototype.match() nên hoạt động. Ngoài ra, sự hiện diện (hoặc vắng mặt) của nó có thể ảnh hưởng đến việc liệu một đối tượng có được coi là biểu thức chính quy hay không.
Try it
class RegExp1 extends RegExp {
[Symbol.match](str) {
const result = RegExp.prototype[Symbol.match].call(this, str);
if (result) {
return "VALID";
}
return "INVALID";
}
}
console.log("2012-07-02".match(new RegExp1("(\\d+)-(\\d+)-(\\d+)")));
// Expected output: "VALID"
Cú pháp
regexp[Symbol.match](str)
Tham số
Giá trị trả về
Một Array có nội dung phụ thuộc vào sự hiện diện hoặc vắng mặt của cờ global (g), hoặc null nếu không tìm thấy kết quả khớp.
- Nếu cờ
gđược sử dụng, tất cả kết quả khớp với biểu thức chính quy đầy đủ sẽ được trả về, nhưng các nhóm bắt không được bao gồm. - Nếu cờ
gkhông được sử dụng, chỉ kết quả khớp đầy đủ đầu tiên và các nhóm bắt liên quan của nó được trả về. Trong trường hợp này,match()sẽ trả về cùng kết quả nhưRegExp.prototype.exec()(một mảng với một số thuộc tính bổ sung).
Mô tả
Phương thức này được gọi nội bộ trong String.prototype.match().
Ví dụ, hai ví dụ sau trả về cùng kết quả.
"abc".match(/a/);
/a/[Symbol.match]("abc");
Nếu regex là global (với cờ g), phương thức exec() của regex sẽ được gọi lặp đi lặp lại cho đến khi exec() trả về null. Ngược lại, exec() chỉ được gọi một lần và kết quả của nó trở thành giá trị trả về của [Symbol.match]().
Vì [Symbol.match]() sẽ tiếp tục gọi exec() cho đến khi nó trả về null, và exec() sẽ tự động đặt lại lastIndex của regex về 0 khi kết quả khớp cuối cùng thất bại, [Symbol.match]() thường không có tác dụng phụ khi thoát. Tuy nhiên, khi regex là sticky nhưng không global, lastIndex sẽ không được đặt lại. Trong trường hợp này, mỗi lần gọi match() có thể trả về kết quả khác nhau.
const re = /[abc]/y;
for (let i = 0; i < 5; i++) {
console.log("abc".match(re), re.lastIndex);
}
// [ 'a' ] 1
// [ 'b' ] 2
// [ 'c' ] 3
// null 0
// [ 'a' ] 1
Khi regex vừa sticky vừa global, nó vẫn sẽ thực hiện khớp sticky — tức là nó sẽ thất bại khi khớp bất kỳ lần xuất hiện nào vượt quá lastIndex.
console.log("ab-c".match(/[abc]/gy)); // [ 'a', 'b' ]
Nếu kết quả khớp hiện tại là một chuỗi rỗng, lastIndex vẫn sẽ được tăng — nếu regex nhận biết Unicode, nó sẽ tăng thêm một điểm mã Unicode; ngược lại, nó tăng thêm một đơn vị mã UTF-16.
console.log("😄".match(/(?:)/g)); // [ '', '', '' ]
console.log("😄".match(/(?:)/gu)); // [ '', '' ]
Phương thức này tồn tại để tùy chỉnh hành vi khớp trong các lớp con RegExp.
Ngoài ra, thuộc tính [Symbol.match] được dùng để kiểm tra liệu một đối tượng có phải là biểu thức chính quy hay không.
Ví dụ
>Gọi trực tiếp
Phương thức này có thể được sử dụng theo cách gần như giống như String.prototype.match(), ngoại trừ this khác và thứ tự đối số khác.
const re = /\d+/g;
const str = "2016-01-02";
const result = re[Symbol.match](str);
console.log(result); // ["2016", "01", "02"]
Sử dụng [Symbol.match]() trong các lớp con
Các lớp con của RegExp có thể ghi đè phương thức [Symbol.match]() để sửa đổi hành vi mặc định.
class MyRegExp extends RegExp {
[Symbol.match](str) {
const result = RegExp.prototype[Symbol.match].call(this, str);
if (!result) return null;
return {
group(n) {
return result[n];
},
};
}
}
const re = new MyRegExp("(\\d+)-(\\d+)-(\\d+)");
const str = "2016-01-02";
const result = str.match(re); // String.prototype.match calls re[Symbol.match]().
console.log(result.group(1)); // 2016
console.log(result.group(2)); // 01
console.log(result.group(3)); // 02
Đặc tả kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.match%> |