RegExp.prototype[Symbol.search]()
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.search]() của các instance RegExp xác định cách String.prototype.search nên hoạt động.
Try it
class RegExp1 extends RegExp {
constructor(str) {
super(str);
this.pattern = str;
}
[Symbol.search](str) {
return str.indexOf(this.pattern);
}
}
console.log("table football".search(new RegExp1("foo")));
// Expected output: 6
Cú pháp
regexp[Symbol.search](str)
Tham số
Giá trị trả về
Chỉ mục của kết quả khớp đầu tiên giữa biểu thức chính quy và chuỗi đã cho, hoặc -1 nếu không tìm thấy kết quả khớp.
Mô tả
Phương thức này được gọi nội bộ trong String.prototype.search(). Ví dụ, hai ví dụ sau trả về cùng kết quả.
"abc".search(/a/);
/a/[Symbol.search]("abc");
Phương thức này không sao chép biểu thức chính quy, không giống như [Symbol.split]() hoặc [Symbol.matchAll](). Tuy nhiên, không giống như [Symbol.match]() hoặc [Symbol.replace](), nó sẽ đặt lastIndex về 0 khi bắt đầu thực thi và khôi phục về giá trị trước đó khi thoát, do đó thường tránh các tác dụng phụ. Điều này có nghĩa là cờ g không có hiệu lực với phương thức này, và nó luôn trả về kết quả khớp đầu tiên trong chuỗi ngay cả khi lastIndex khác không. Điều này cũng có nghĩa là regex sticky sẽ luôn tìm kiếm nghiêm ngặt ở đầu chuỗi.
const re = /[abc]/g;
re.lastIndex = 2;
console.log("abc".search(re)); // 0
const re2 = /[bc]/y;
re2.lastIndex = 1;
console.log("abc".search(re2)); // -1
console.log("abc".match(re2)); // [ 'b' ]
[Symbol.search]() luôn gọi phương thức exec() của regex đúng một lần, và trả về thuộc tính index của kết quả, hoặc -1 nếu kết quả là null.
Phương thức này tồn tại để tùy chỉnh hành vi tìm kiếm trong các lớp con RegExp.
Ví dụ
>Gọi trực tiếp
Phương thức này có thể được sử dụng gần như giống như String.prototype.search(), ngoại trừ giá trị khác nhau của this và thứ tự đối số khác nhau.
const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.search](str);
console.log(result); // 4
Sử dụng [Symbol.search]() trong các lớp con
Các lớp con của RegExp có thể ghi đè phương thức [Symbol.search]() để sửa đổi hành vi.
class MyRegExp extends RegExp {
constructor(str) {
super(str);
this.pattern = str;
}
[Symbol.search](str) {
return str.indexOf(this.pattern);
}
}
const re = new MyRegExp("a+b");
const str = "ab a+b";
const result = str.search(re); // String.prototype.search calls re[Symbol.search]().
console.log(result); // 3
Đặc tả kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.search%> |