如何检查字符串是否以JavaScript中的特定字符结束?
示例:我有一个字符串
var str = "mystring#";
我想知道字符串是否以#结尾。我怎么检查呢?
在JavaScript中有endsWith()方法吗? 我有一个解决方案,取字符串的长度,并得到最后一个字符,并检查它。
这是最好的办法还是还有别的办法?
如何检查字符串是否以JavaScript中的特定字符结束?
示例:我有一个字符串
var str = "mystring#";
我想知道字符串是否以#结尾。我怎么检查呢?
在JavaScript中有endsWith()方法吗? 我有一个解决方案,取字符串的长度,并得到最后一个字符,并检查它。
这是最好的办法还是还有别的办法?
当前回答
我不知道你怎么想,但是:
var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!
为什么是正则表达式?为什么要破坏原型?字符串的子串吗?来吧……
其他回答
不要使用正则表达式。即使在语速快的语言中,它们也很慢。只需编写一个检查字符串结尾的函数。这个库有很好的例子:groundjs/util.js。 在String.prototype中添加函数时要小心。这段代码有如何做到这一点的很好的例子:groundjs/prototype.js 总的来说,这是一个很好的语言级库:groundjs 你也可以看看lodash
更新(2015年11月24日):
这个答案最初发布于2010年(六年前),所以请注意这些有见地的评论:
绍纳-
google用户更新-看起来ECMA6增加了这个功能。MDN文章还展示了一个polyfill。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
T.J.克劳德-
在现代浏览器中创建子字符串并不昂贵;这个答案很可能是在2010年发布的。现在,简单的this.substr(-suffix.length) ===后缀方法在Chrome上是最快的,在IE11上和indexOf一样,在Firefox上只慢了4% (fergetaboutit领域):https://jsben.ch/OJzlM并且在结果为false时更快:jsperf.com/endswith-stackoverflow-when-false当然,随着ES6添加endsWith,这一点是没有意义的。: -)
最初的回答:
我知道这是一个老问题了……但我也需要这个,我需要它跨浏览器工作,所以……结合每个人的回答和评论,并简化一下:
String.prototype.endsWith = function(suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
不创建子字符串 使用本机indexOf函数以获得最快的结果 使用indexOf的第二个参数跳过不必要的比较 在Internet Explorer中工作 没有正则表达式的复杂性
此外,如果你不喜欢在原生数据结构的原型中填充东西,这里有一个独立的版本:
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;
};
}
不幸的是没有。 If ("mystring#".substr(-1) === "#") {}
如果你不想使用lasIndexOf或substr,那么为什么不只是看看字符串在它的自然状态(即。一个数组)
String.prototype.endsWith = function(suffix) {
if (this[this.length - 1] == suffix) return true;
return false;
}
或者作为一个独立的函数
function strEndsWith(str,suffix) {
if (str[str.length - 1] == suffix) return true;
return false;
}
这个版本避免了创建子字符串,并且没有使用正则表达式(这里有些正则表达式可以工作;其他的则坏了):
String.prototype.endsWith = function(str)
{
var lastIndex = this.lastIndexOf(str);
return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}
如果性能对您来说很重要,那么值得测试一下lastIndexOf是否比创建子字符串更快。(这可能取决于你使用的JS引擎…)在匹配的情况下,它可能会更快,当字符串很小的时候——但是当字符串很大的时候,它需要回顾整个事情,即使我们真的不关心:(
对于检查单个字符,查找长度然后使用charAt可能是最好的方法。