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

js
regexp[Symbol.search](str)

Tham số

str

Một String là đích của tìm kiếm.

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ả.

js
"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.

js
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.

js
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.

js
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

Thông số kỹ thuật
ECMAScript® 2027 Language Specification
# sec-regexp.prototype-%symbol.search%

Tương thích trình duyệt

Xem thêm