如何检查字符串是否以 JavaScript 中的特定字符结尾?
示例:我有一个字符串
var str = "mystring#";
我想知道该字符串是否以#
. 我该如何检查?
endsWith()
JavaScript 中有方法吗?我有一个解决方案是取字符串的长度并获取最后一个字符并检查它。
这是最好的方法还是有其他方法?
如何检查字符串是否以 JavaScript 中的特定字符结尾?
示例:我有一个字符串
var str = "mystring#";
我想知道该字符串是否以#
. 我该如何检查?
endsWith()
JavaScript 中有方法吗?
我有一个解决方案是取字符串的长度并获取最后一个字符并检查它。
这是最好的方法还是有其他方法?
更新(2015 年 11 月 24 日):
这个答案最初是在 2010 年(六年前)发布的。所以请注意这些有见地的评论:
针对 Google 员工的更新 - 看起来 ECMA6 添加了此功能。MDN 文章还展示了一个 polyfill。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
在现代浏览器上创建子字符串并不昂贵;这个答案很可能是在 2010 年发布的。现在,简单的
this.substr(-suffix.length) === suffix
方法在 Chrome 上最快,在 IE11 上与 indexOf 相同,在 Firefox 上仅慢 4%(fergetaboutit 区域):jsperf.com/endswith-stackoverflow/14当结果为假时,速度更快:jsperf.com/endswith-stackoverflow-when-false 当然,随着 ES6 增加了endsWith,这一点没有实际意义。:-)
原始答案:
我知道这是一个老问题......但我也需要这个,我需要它跨浏览器工作所以......结合每个人的答案和评论并稍微简化一下:
String.prototype.endsWith = function(suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
indexOf
功能获得最快的结果indexOf
以跳过此外,如果您不喜欢在本机数据结构的原型中填充东西,这里有一个独立版本:
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
编辑:正如@hamish 在评论中所指出的,如果您想在安全方面犯错并检查是否已经提供了一个实现,您可以typeof
像这样添加一个检查:
if (typeof String.prototype.endsWith !== 'function') {
String.prototype.endsWith = function(suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
}
/#$/.test(str)
将适用于所有浏览器,不需要猴子补丁String
,也不需要像lastIndexOf
没有匹配时那样扫描整个字符串。
如果要匹配可能包含正则表达式特殊字符(例如 )的常量字符串'$'
,则可以使用以下命令:
function makeSuffixRegExp(suffix, caseInsensitive) {
return new RegExp(
String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
caseInsensitive ? "i" : "");
}
然后你可以像这样使用它
makeSuffixRegExp("a[complicated]*suffix*").test(str)
if( "mystring#".substr(-1) === "#" ) {}
来吧,这是正确的endsWith
实现:
String.prototype.endsWith = function (s) {
return this.length >= s.length && this.substr(this.length - s.length) == s;
}
lastIndexOf
如果没有匹配项,using只会创建不必要的 CPU 循环。
此版本避免创建子字符串,并且不使用正则表达式(此处的某些正则表达式答案可以使用;其他的已损坏):
String.prototype.endsWith = function(str)
{
var lastIndex = this.lastIndexOf(str);
return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}
如果性能对您很重要,那么值得测试是否lastIndexOf
实际上比创建子字符串更快。(这很可能取决于您使用的 JS 引擎......)在匹配的情况下它可能会更快,并且当字符串很小时 - 但是当字符串很大时,它甚至需要回顾整个事情虽然我们并不在乎:(
对于检查单个字符,找到长度然后使用charAt
可能是最好的方法。