endsWith在JavaScript中

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

例如:我有一个字符串

var str = "mystring#"; 

我想知道这个字符串是以#结尾的。 我如何检查它?

  1. JavaScript中有一个endsWith()方法吗?

  2. 我有一个解决方案是取出字符串的长度,并得到最后一个字符,并检查它。

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

更新(2015年11月24日):

这个答案最初是在2010年(前六年)发布的,所以请注意这些富有洞察力的评论:

  • Shauna – Google员工更新 – 看起来像ECMA6增加了这个功能。 MDN文章还显示了一个polyfill。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

  • TJ Crowder – 在现代浏览器上创建子串并不昂贵; 这个答案很可能在2010年发布。 现在,简单的this.substr(-suffix.length) === suffix方法在Chrome上是最快的,在IE11上和indexOf一样,在Firefox上只有4%的速度(比较慢): jsperf.com/endswith-stackoverflow / 14当结果为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; }; } 
 /#$/.test(str) 

将在所有浏览器上工作,不需要Monkey修补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; 

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

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 :在该字符串末尾搜索的字符。

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

描述

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

例子

 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语言规范第6版(ECMA-262)

浏览器兼容性

浏览器兼容性

 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; } 
 if( ("mystring#").substr(-1,1) == '#' ) 

– 要么 –

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

我不了解你,但是:

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

为什么正则表达式 为什么搞乱原型? SUBSTR? 来吧…

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

http://stringjs.com/

包括js文件,然后像这样使用S变量:

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

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

 npm install string 

然后要求它作为S变量:

 var S = require('string'); 

网页也有链接到替代字符串库,如果这个不喜欢你的幻想。

如果你正在使用lodash :

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

如果不使用lodash,可以从源头上借用。

 function strEndsWith(str,suffix) { var reguex= new RegExp(suffix+'$'); if (str.match(reguex)!=null) return true; return false; } 

对于这样一个小问题,很多事情只是使用这个正则表达式

 var str = "mystring#"; var regex = /^.*#$/ if (regex.test(str)){ //if it has a trailing '#' } 

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

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

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

因此强烈建议按照答案中提到的那样添加检查是否存在本地实现。

未来证明和/或防止覆盖现有原型的一种方法是测试检查,看看它是否已经被添加到字符串原型。 这是我对非正则表达式高度评价的版本。

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

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

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

正则表达式就像另一个快速的替代方法,使用正则表达式:

 // Would be equivalent to: // "Hello World!".endsWith("World!") "Hello World!".match("World!$") != null 
 function check(str) { var lastIndex = str.lastIndexOf('/'); return (lastIndex != -1) && (lastIndex == (str.length - 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.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)/)); 

这建立在@ 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); } }; } 

这需要underscorejs – 但可以调整,以消除下划线的依赖。

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

优点:

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

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

我发现比我的更好的解决方案。 感谢大家。

为咖啡标记

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

在所有这些长时间的答案之后,我发现这段代码简单易懂!

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

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