RegExp.prototype[Symbol.search]()
[Symbol.search]()
方法是 RegExp
实例的方法,它指定了 String.prototype.search
的行为方式。
试一试
语法
js
regexp[Symbol.search](str)
参数
返回值
正则表达式与给定字符串之间第一个匹配项的索引,如果未找到匹配项则返回 -1
。
描述
此方法在 String.prototype.search()
中内部调用。例如,以下两个示例返回相同的结果。
js
"abc".search(/a/);
/a/[Symbol.search]("abc");
此方法不会复制正则表达式,这与 [Symbol.split]()
或 [Symbol.matchAll]()
不同。但是,与 [Symbol.match]()
或 [Symbol.replace]()
不同,它会在执行开始时将 lastIndex
设置为 0,并在退出时将其恢复为先前值,因此通常避免副作用。这意味着 g
标志对此方法无效,即使 lastIndex
非零,它也始终返回字符串中的第一个匹配项。这也意味着粘性正则表达式将始终严格地在字符串开头进行搜索。
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]()
始终恰好调用一次正则表达式的 exec()
方法,并返回结果的 index
属性,如果结果为 null
则返回 -1
。
此方法用于在 RegExp
子类中自定义搜索行为。
示例
直接调用
此方法的使用方式几乎与 String.prototype.search()
相同,除了 this
的值和参数顺序不同。
js
const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.search](str);
console.log(result); // 4
在子类中使用 [Symbol.search]()
RegExp
的子类可以重写 [Symbol.search]()
方法以修改行为。
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
规范
规范 |
---|
ECMAScript 语言规范 # sec-regexp.prototype-%symbol.search% |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。