endsWith在JavaScript中

时间:2008-11-11 11:15:33

标签: javascript string ends-with

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

示例:我有一个字符串

var str = "mystring#";

我想知道该字符串是否以#结尾。我怎么检查呢?

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

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

  3. 这是最好的方式还是有其他方式?

31 个答案:

答案 0 :(得分:1745)

更新(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;
    };
}

答案 1 :(得分:291)

/#$/.test(str)

适用于所有浏览器,不需要修补猴子String,也不需要像lastIndexOf那样在没有匹配时扫描整个字符串。

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

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

然后你可以像这样使用它

makeSuffixRegExp("a[complicated]*suffix*").test(str)

答案 2 :(得分:86)

  1. 不幸的是没有。
  2. if( "mystring#".substr(-1) === "#" ) {}

答案 3 :(得分:66)

来吧,这是正确的endsWith实施:

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

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

答案 4 :(得分:56)

这个版本避免了创建子字符串,并且不使用正则表达式(这里的一些正则表达式答案会起作用;其他的都会被破坏):

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

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

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

答案 5 :(得分:24)

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

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}

答案 6 :(得分:17)

return this.lastIndexOf(str) + str.length == this.length;

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

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

可能的解决方法是

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

答案 7 :(得分:14)

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

摘要

endsWith()方法确定字符串是否以另一个字符串的字符结尾,并在适当时返回true或false。

语法

str.endsWith(searchString [, position]);

参数

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

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

描述

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

实施例

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 Language Specification 6th Edition (ECMA-262)

浏览器兼容性

Browser compatibility

答案 8 :(得分:9)

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

- 或 -

if( ("mystring#").match(/#$/) )

答案 9 :(得分:8)

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;
}

答案 10 :(得分:7)

如果您正在使用lodash

_.endsWith('abc', 'c'); // true

如果不使用lodash,您可以借用source

答案 11 :(得分:7)

我不了解你,但是:

var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!

为什么正则表达式?为什么搞乱原型? SUBSTR?拜托...

答案 12 :(得分:6)

我刚刚了解了这个字符串库:

http://stringjs.com/

包含js文件,然后使用S变量,如下所示:

S('hi there').endsWith('hi there')

它也可以通过安装在NodeJS中使用:

npm install string

然后将其作为S变量:

var S = require('string');

该网页还包含指向备用字符串库的链接,如果这个字符串库没有您喜欢的话。

答案 13 :(得分:6)

使用正则表达式的另一个快速替代方案对我来说就像一个魅力:

// Would be equivalent to:
// "Hello World!".endsWith("World!")
"Hello World!".match("World!$") != null

答案 14 :(得分:4)

function strEndsWith(str,suffix) {
  var reguex= new RegExp(suffix+'$');

  if (str.match(reguex)!=null)
      return true;

  return false;
}

答案 15 :(得分:4)

这么小的问题有很多东西,只需使用这个正则表达式



var str = "mystring#";
var regex = /^.*#$/

if (regex.test(str)){
  //if it has a trailing '#'
}




答案 16 :(得分:4)

这个问题花了很多年。让我为想要使用投票最多的chakrit的答案的用户添加一个重要的更新。

'的endsWith'函数已作为ECMAScript 6(实验技术)的一部分添加到JavaScript中

请参阅此处:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

因此,强烈建议添加检查是否存在本机实现,如答案中所述。

答案 17 :(得分:2)

@ chakrit接受的答案是一个可靠的方法来自己做。但是,如果您正在寻找一个打包的解决方案,我建议您查看underscore.string,正如@mlunoe指出的那样。使用underscore.string,代码为:

function endsWithHash(str) {
  return _.str.endsWith(str, '#');
}

答案 18 :(得分:2)

未来证明和/或防止覆盖现有原型的方法是进行测试检查,看它是否已经添加到String原型中。这是我对非正则表达式高评级版本的看法。

if (typeof String.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}

答案 19 :(得分:2)

function check(str)
{
    var lastIndex = str.lastIndexOf('/');
    return (lastIndex != -1) && (lastIndex  == (str.length - 1));
}

答案 20 :(得分:1)

经过所有这些长长的答案,我发现这段代码简单易懂!

function end(str, target) {
  return str.substr(-target.length) == target;
}

答案 21 :(得分:1)

这是endsWith的实现:

String.prototype.endsWith =函数(str){   返回this.length> = str.length && this.substr(this.length-str.length)== str; }

答案 22 :(得分:1)

这是endsWith的实现: String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }

答案 23 :(得分:1)

String.prototype.endWith = function (a) {
    var isExp = a.constructor.name === "RegExp",
    val = this;
    if (isExp === false) {
        a = escape(a);
        val = escape(val);
    } else
        a = a.toString().replace(/(^\/)|(\/$)/g, "");
    return eval("/" + a + "$/.test(val)");
}

// example
var str = "Hello";
alert(str.endWith("lo"));
alert(str.endWith(/l(o|a)/));

答案 24 :(得分: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;
}

答案 25 :(得分:0)

对于coffeescript

String::endsWith = (suffix) ->
  -1 != @indexOf suffix, @length - suffix.length

答案 26 :(得分:0)

不要使用正则表达式。即使在快速语言中它们也很慢。只需编写一个检查字符串结尾的函数。这个库有很好的例子:groundjs/util.js。 小心向String.prototype添加一个函数。这段代码有很好的例子说明如何:groundjs/prototype.js 一般来说,这是一个很好的语言级库:groundjs 你也可以看看lodash

答案 27 :(得分:0)

if(typeof String.prototype.endsWith !== "function") {
    /**
     * String.prototype.endsWith
     * Check if given string locate at the end of current string
     * @param {string} substring substring to locate in the current string.
     * @param {number=} position end the endsWith check at that position
     * @return {boolean}
     *
     * @edition ECMA-262 6th Edition, 15.5.4.23
     */
    String.prototype.endsWith = function(substring, position) {
        substring = String(substring);

        var subLen = substring.length | 0;

        if( !subLen )return true;//Empty string

        var strLen = this.length;

        if( position === void 0 )position = strLen;
        else position = position | 0;

        if( position < 1 )return false;

        var fromIndex = (strLen < position ? strLen : position) - subLen;

        return (fromIndex >= 0 || subLen === -fromIndex)
            && (
                position === 0
                // if position not at the and of the string, we can optimise search substring
                //  by checking first symbol of substring exists in search position in current string
                || this.charCodeAt(fromIndex) === substring.charCodeAt(0)//fast false
            )
            && this.indexOf(substring, fromIndex) === fromIndex
        ;
    };
}

<强>优点:

答案 28 :(得分:0)

这建立在@charkit接受的答案之上,允许使用字符串数组或字符串作为参数传入。

if (typeof String.prototype.endsWith === 'undefined') {
    String.prototype.endsWith = function(suffix) {
        if (typeof suffix === 'String') {
            return this.indexOf(suffix, this.length - suffix.length) !== -1;
        }else if(suffix instanceof Array){
            return _.find(suffix, function(value){
                console.log(value, (this.indexOf(value, this.length - value.length) !== -1));
                return this.indexOf(value, this.length - value.length) !== -1;
            }, this);
        }
    };
}

这需要下划线 - 但可以调整以删除下划线依赖。

答案 29 :(得分:0)

7岁的帖子,但我无法理解前几篇文章,因为它们很复杂。所以,我写了自己的解决方案:

function strEndsWith(str, endwith)
{
    var lastIndex = url.lastIndexOf(endsWith);
    var result = false;
    if (lastIndex > 0 && (lastIndex + "registerc".length) == url.length)
    {
        result = true;
    }
    return result;
}

答案 30 :(得分:0)

所有这些都是非常有用的例子。添加String.prototype.endsWith = function(str)将帮助我们简单地调用方法来检查我们的字符串是否以其结尾,正好regexp也会这样做。

我找到了比我更好的解决方案。谢谢你们。