JavaScript 中的 endsWith

如何在 JavaScript 中检查字符串是否以特定字符结尾?

示例:我有一个字符串

var str = "mystring#";

我想知道该字符串是否以#结尾。我该如何检查?

  1. JavaScript 中是否有endsWith()方法?

  2. 我有一个解决方案是获取字符串的长度并获取最后一个字符并进行检查。

这是最好的方法还是还有其他方法?

答案

更新(2015 年 11 月 24 日):

该答案最初发布于 2010 年(六年前),因此请注意以下有见地的评论:


原始答案:

我知道这是一个老问题了... 但是我也需要这个,并且我需要它来跨浏览器工作,所以... 结合每个人的答案和评论并稍微简化一下:

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;
    };
}
/#$/.test(str)

可以在所有浏览器上运行,不需要猴子打补丁String ,并且不需要扫描整个字符串,就像没有匹配项时lastIndexOf一样。

如果要匹配可能包含正则表达式特殊字符(例如'$'的常量字符串,则可以使用以下命令:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

然后你可以像这样使用它

makeSuffixRegExp("a[complicated]*suffix*").test(str)
  1. 不幸的是没有。
  2. if( "mystring#".substr(-1) === "#" ) {}

拜托,这是正确endsWith实现:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

如果没有匹配项,使用lastIndexOf只会创建不必要的 CPU 循环。

此版本避免创建子字符串,并且不使用正则表达式(此处提供一些正则表达式答案;而其他则不适用):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

如果性能对您很重要,则值得测试lastIndexOf是否实际上比创建子字符串快。 (这可能取决于您使用的 JS 引擎...)在匹配的情况下,它可能会更快,并且当字符串很小时 - 但是当字符串很大时,甚至需要回顾整个过程虽然我们并不在乎:(

对于检查单个字符,找到长度然后使用charAt可能是最好的方法。

没有看到slice方法的方法。所以我就把它留在这里:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}
return this.lastIndexOf(str) + str.length == this.length;

在原始字符串长度比搜索字符串长度小一且找不到搜索字符串的情况下不起作用:

lastIndexOf 返回 - 1,然后添加搜索字符串的长度,然后剩下原始字符串的长度。

可能的解决方法是

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length

来自 developer.mozilla.org String.prototype.endsWith()

摘要

endsWith()方法确定一个字符串是否以另一个字符串的字符结尾,并根据情况返回 true 或 false。

句法

str.endsWith(searchString [, position]);

参量

  • searchString :在此字符串末尾要搜索的字符。

  • position :在此字符串中搜索,就好像该字符串只有这么长;默认为该字符串的实际长度,限制在该字符串的长度所建立的范围内。

描述

此方法使您可以确定一个字符串是否以另一个字符串结尾。

例子

var str = "To be, or not to be, that is the question.";

alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

技术指标

ECMAScript 语言规范第六版(ECMA-262)

浏览器兼容性

浏览器兼容性

if( ("mystring#").substr(-1,1) == '#' )

- 要么 -

if( ("mystring#").match(/#$/) )
String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

我希望这有帮助

var myStr = “  Earth is a beautiful planet  ”;
var myStr2 = myStr.trim();  
//==“Earth is a beautiful planet”;

if (myStr2.startsWith(“Earth”)) // returns TRUE

if (myStr2.endsWith(“planet”)) // returns TRUE

if (myStr.startsWith(“Earth”)) 
// returns FALSE due to the leading spaces…

if (myStr.endsWith(“planet”)) 
// returns FALSE due to trailing spaces…

传统方式

function strStartsWith(str, prefix) {
    return str.indexOf(prefix) === 0;
}

function strEndsWith(str, suffix) {
    return str.match(suffix+"$")==suffix;
}