【发布时间】:2020-12-11 10:19:54
【问题描述】:
为什么 "a".search(".") 在 JavaScript 中返回 0,即使 "".search(".") 返回 -1? "."用在search()中是否有特殊含义?
【问题讨论】:
标签: javascript string methods
为什么 "a".search(".") 在 JavaScript 中返回 0,即使 "".search(".") 返回 -1? "."用在search()中是否有特殊含义?
【问题讨论】:
标签: javascript string methods
来自MDN:
search()方法执行搜索正则表达式与此String对象之间的匹配项。⋮
如果传递了非正则表达式对象
regexp,它会隐式转换为带有new RegExp(regexp)的正则表达式。
在这种情况下会发生这种情况,"." 被转换为 /./。
. 在 JavaScript 正则表达式中确实具有特殊含义:它匹配任何非换行符。 "a" 在位置 0 处有一个非换行符,"" 没有要匹配的非换行符。
您可能一直在考虑String.prototype.indexOf,它会搜索字符串。
console.log("a".indexOf("."));
【讨论】:
search() 是唯一“隐式”将其参数转换为正则表达式的方法吗?还是我必须提防其他任何需要字符串的人?
原因是.search() 以正则表达式为参数。如果您传递一个字符串,它会隐式转换为正则表达式。但是,当您谈论“.”时,将其更改为正则表达式时,它可以变成/./,但它必须是/\./。这就是为什么,您必须传递一个正则表达式来代替“.”的字符串。
这样做: "a".search(/\./);
【讨论】:
search() 方法返回第一个匹配项的索引,如果没有找到匹配项,则返回 -1。
console.log("asd".search("d")); // 2
console.log("aasds.asdd".search(/\./)); // 5
匹配点的正确语法是使用带有转义字符\.的正则表达式
【讨论】:
. 匹配除行终止符之外的任何字符。
因此,"a".search(".") 返回 0。
在0 索引处匹配a。
【讨论】:
对于您的查询,. 在regex 表达式中具有特殊含义。 search() 在后面使用 regex。所以,你必须把escape 字符放在特殊字符之前,比如,
console.log( "".search("\\.") );
【讨论】: