endsWith in JavaScript
如何检查字符串是否以javascript中的特定字符结尾?
示例:我有一个字符串
1 | var str ="mystring#"; |
我想知道这个字符串是否以
javascript中是否有
我有一个解决方案,就是取字符串的长度,得到最后一个字符并检查它。
这是最好的办法还是其他办法?
更新(2015年11月24日):
这个答案最初发表在2010年(六年前),所以请注意这些有见地的评论:
shauna-googler的更新-看起来像ecma6添加了这个函数。MDN文章还显示了一个polyfill。https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/string/endswith
T.J.Crowder——创建子字符串在现代浏览器上并不昂贵,很可能是在2010年发布这个答案的时候。如今,简单的
this.substr(-suffix.length) === suffix 方法在Chrome上速度最快,在ie11上与indexof相同,而在firefox:jspef.com/endswith-stackoverflow/14上(fergetaboutit territory),速度只慢4%,当结果为假时,速度更快:jspeff.com/endswith-stackoverflow-when-false当然,ES6加上endswith,这一点是没有意义的。-)
原始答案:
我知道这是一个由来已久的问题…但我也需要这个,我需要它跨浏览器工作,所以…将每个人的回答和评论结合起来,并将其简化一点:
1 2 3 | String.prototype.endsWith = function(suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; }; |
- 不创建子字符串
- 使用本机
indexOf 函数获得最快的结果 - 使用
indexOf 的第二个参数跳过不必要的比较 - 在Internet Explorer中工作
- 无regex并发症
另外,如果您不喜欢在本机数据结构的原型中填充内容,这里有一个独立的版本:
1 2 3 | function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } |
编辑:正如@hamish在评论中所指出的,如果您希望在安全方面出错,并检查是否已经提供了实现,您只需添加一个
1 2 3 4 5 | if (typeof String.prototype.endsWith !== 'function') { String.prototype.endsWith = function(suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; }; } |
1 | /#$/.test(str) |
适用于所有浏览器,不需要Monkey补丁
如果要匹配可能包含正则表达式特殊字符的常量字符串,如
1 2 3 4 5 | function makeSuffixRegExp(suffix, caseInsensitive) { return new RegExp( String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g,"\\$&") +"$", caseInsensitive ?"i" :""); } |
然后你可以这样使用它
1 | makeSuffixRegExp("a[complicated]*suffix*").test(str) |
来吧,这是正确的
1 2 3 | String.prototype.endsWith = function (s) { return this.length >= s.length && this.substr(this.length - s.length) == s; } |
如果没有匹配项,使用
此版本避免创建子字符串,并且不使用正则表达式(此处的某些regex答案有效;其他答案无效):
1 2 3 4 5 | String.prototype.endsWith = function(str) { var lastIndex = this.lastIndexOf(str); return (lastIndex !== -1) && (lastIndex + str.length === this.length); } |
如果性能对您很重要,那么有必要测试
对于检查单个字符,找到长度然后使用
没有用
1 2 3 | function endsWith(str, suffix) { return str.slice(-suffix.length) === suffix } |
1 | return this.lastIndexOf(str) + str.length == this.length; |
在原始字符串长度小于搜索字符串长度且未找到搜索字符串的情况下不起作用:
LastIndexOf返回-1,然后添加搜索字符串长度,并保留原始字符串的长度。
可能的解决办法是
1 | return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length |
来自developer.mozilla.org string.prototype.endswith()。
总结1 | str.endsWith(searchString [, position]); |
参数
搜索字符串:要在此字符串结尾处搜索的字符。
职位:在这个字符串中搜索,就好像这个字符串只有这么长;默认为这个字符串的实际长度,固定在这个字符串长度所确定的范围内。
描述
此方法允许您确定一个字符串是否以另一个字符串结尾。
实例1 2 3 4 5 | 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)
浏览器兼容性1 | if( ("mystring#").substr(-1,1) == '#' ) |
--或者——
1 | if( ("mystring#").match(/#$/) ) |
1 2 3 4 5 | String.prototype.endsWith = function(str) {return (this.match(str+"$")==str)} String.prototype.startsWith = function(str) {return (this.match("^"+str)==str)} |
我希望这有帮助
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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… |
传统的方式
1 2 3 4 5 6 7 | function strStartsWith(str, prefix) { return str.indexOf(prefix) === 0; } function strEndsWith(str, suffix) { return str.match(suffix+"$")==suffix; } |
如果您使用的是罗达什:
1 | _.endsWith('abc', 'c'); // true |
如果不使用火山灰,你可以从它的源头借来。
我不了解你,但是:
1 2 | var s ="mystring#"; s.length >= 1 && s[s.length - 1] == '#'; // will do the thing! |
为什么是正则表达式?为什么要弄乱原型?子串?拜托。。。
我刚刚了解了这个字符串库:
http://stringjs.com/
包括JS文件,然后使用
1 | S('hi there').endsWith('hi there') |
它也可以通过安装在nodejs中使用:
1 | npm install string |
然后要求它作为
1 | var S = require('string'); |
如果您不喜欢,网页也有指向备用字符串库的链接。
另一个快速的替代品对我来说很有吸引力,使用regex:
1 2 3 | // Would be equivalent to: //"Hello World!".endsWith("World!") "Hello World!".match("World!$") != null |
1 2 3 4 5 6 7 8 | function strEndsWith(str,suffix) { var reguex= new RegExp(suffix+'$'); if (str.match(reguex)!=null) return true; return false; } |
对于这样一个小问题,有很多事情要做,只需使用这个正则表达式
1 2 3 4 5 6 | var str ="mystring#"; var regex = /^.*#$/ if (regex.test(str)){ //if it has a trailing '#' } |
这个问题由来已久。让我为想要使用投票最多的Chakrit答案的用户添加一个重要的更新。
"endswith"函数已经作为ecmascript 6(实验技术)的一部分添加到javascript中。
请参阅:https://developer.mozilla.org/en/docs/web/javascript/reference/global_objects/string/endswith
因此,强烈建议添加对本地实现存在性的检查,如答案中所述。
@查克里特接受的答案是一种自己动手的可靠方法。但是,如果您正在寻找打包的解决方案,我建议您查看underline.string,正如@mlunoe指出的那样。使用underline.string,代码将是:
1 2 3 | function endsWithHash(str) { return _.str.endsWith(str, '#'); } |
未来验证和/或防止覆盖现有原型的一种方法是测试检查,看看它是否已经添加到字符串原型中。这是我对非regex高评级版本的看法。
1 2 3 4 5 | if (typeof String.endsWith !== 'function') { String.prototype.endsWith = function (suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; }; } |
1 2 3 4 5 | function check(str) { var lastIndex = str.lastIndexOf('/'); return (lastIndex != -1) && (lastIndex == (str.length - 1)); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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)/)); |
如果您不想使用lasindexof或substr,那么为什么不直接查看字符串的自然状态(即数组)
1 2 3 4 | String.prototype.endsWith = function(suffix) { if (this[this.length - 1] == suffix) return true; return false; } |
或作为独立函数
1 2 3 4 | function strEndsWith(str,suffix) { if (str[str.length - 1] == suffix) return true; return false; } |
经过这么长时间的回答,我发现这段代码简单易懂!
1 2 3 | function end(str, target) { return str.substr(-target.length) == target; } |
这是endswith的实现:
string.prototype.endswith=函数(str){返回this.length>=str.length&;this.substr(this.length-str.length)==str;}
这是endswith的实现:
String.prototype.endsWith = function (str) {
return this.length >= str.length && this.substr(this.length - str.length) == str;
}
不要使用正则表达式。即使是快速的语言,它们也很慢。只需编写一个检查字符串结尾的函数。这个库有很好的例子:groundjs/util.js。小心向string.prototype添加函数。这段代码有一些很好的例子来说明如何做到这一点:groundjs/prototype.js一般来说,这是一个很好的语言级库:groundJS你也可以看看罗达什
所有这些都是非常有用的例子。添加EDOCX1[1]将有助于我们简单地调用该方法来检查字符串是否以它结尾,而regexp也会这样做。
我找到了比我更好的解决办法。谢谢大家。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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 ; }; } |
效益:
- 此版本不只是重新使用indexof。
- 长弦乐器的最佳表现。以下是速度测试http://jspef.com/starts-ends-with/4
- 完全兼容ECMAScript规范。它通过了测试
咖啡说明
1 2 | String::endsWith = (suffix) -> -1 != @indexOf suffix, @length - suffix.length |
7岁的职位,但我无法理解前几个职位,因为他们是复杂的。所以,我写了自己的解决方案:
1 2 3 4 5 6 7 8 9 10 | function strEndsWith(str, endwith) { var lastIndex = url.lastIndexOf(endsWith); var result = false; if (lastIndex > 0 && (lastIndex +"registerc".length) == url.length) { result = true; } return result; } |
这建立在@charkit接受的答案的基础上,允许将字符串数组或字符串作为参数传入。
1 2 3 4 5 6 7 8 9 10 11 12 | 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); } }; } |
这需要下划线-但可能需要调整以删除下划线依赖项。