在 JavaScript 中以结尾

IT技术 javascript string ends-with
2021-01-13 23:55:06

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

示例:我有一个字符串

var str = "mystring#";

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

  1. endsWith()JavaScript 中方法吗?

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

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

6个回答

更新(2015 年 11 月 24 日):

这个答案最初是在 2010 年(六年前)发布的。所以请注意这些有见地的评论:

针对 Google 员工的更新 - 看起来 ECMA6 添加了此功能。MDN 文章还展示了一个 polyfill。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

在现代浏览器上创建子字符串并不昂贵;这个答案很可能是在 2010 年发布的。现在,简单的this.substr(-suffix.length) === suffix方法在 Chrome 上最快,在 IE11 上与 indexOf 相同,在 Firefox 上仅慢 4%(fergetaboutit 区域):jsperf.com/endswith-stackoverflow/14当结果为假时,速度更快: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;
    };
}
针对 Google 员工的更新 - 看起来 ECMA6 添加了此功能。MDN 文章还展示了一个 polyfill。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-10 23:55:06
在现代浏览器上创建子字符串并不昂贵;这个答案很可能是在 2010 年发布的。现在,简单的this.substr(-suffix.length) === suffix方法在 Chrome 上最快,在 IE11 上与 相同,indexOf在 Firefox 上仅慢 4%(fergetaboutit 区域):jsperf.com/endswith-stackoverflow/14当结果为假时,速度更快:jsperf .com/endswith-stackoverflow-when-false当然,随着 ES6 的加入endsWith,这一点没有实际意义。:-)
2021-03-20 23:55:06
@lukas.pukenis 它跳到最后,只在最后检查一个后缀实例。搜索字符串是否出现在其他地方并不重要。
2021-03-30 23:55:06
您提到的正则表达式并发症是什么?
2021-04-06 23:55:06
添加对未定义参数“后缀”的情况的检查”: if (typeof String.prototype.endsWith !== 'function') { String.prototype.endsWith = function(suffix) { return this.indexOf(suffix) , this.length - ((suffix && suffix.length) || 0)) !== -1; }; }
2021-04-09 23:55:06
/#$/.test(str)

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

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

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

然后你可以像这样使用它

makeSuffixRegExp("a[complicated]*suffix*").test(str)
+1 用于跨浏览器兼容性。在 Chrome 28.0.1500.72 m、Firefox 22.0 和 IE9 上测试。
2021-03-14 23:55:06
@Tom Brito,这是一个正则表达式文字。语法是从 Perl 借来的。请参阅developer.mozilla.org/en/Core_JavaScript_1.5_Guide/...或有关不必要的详细信息,请参阅 EcmaScript 语言规范的第 7.8.5 节。
2021-03-15 23:55:06
lastIndexOf 扫描所有字符串?我以为它会从头到尾搜索。
2021-03-26 23:55:06
如果您正在检查常量子字符串,这很好也很简单。
2021-03-30 23:55:06
@TomBrito,lastIndexOf仅在未找到匹配项或在开头找到匹配项时才扫描整个字符串。如果末尾有匹配项,那么它的作用与后缀的长度成正比。是的,以 结尾时为/asdf$/.test(str)str"asdf"
2021-04-01 23:55:06
  1. 不幸的是没有。
  2. if( "mystring#".substr(-1) === "#" ) {}
@Anthony,嗯...所以使用 .Length-1,有什么问题?if (mystring.substr(mystring.length-1) === "#") {} 在 IE 中工作得很好。
2021-03-18 23:55:06
@BrainSlugs83 - 这正是问题所在:“.length-1”语法在 IE 中有效,而“-1”语法则不然。这是需要牢记的,所以 +1 给 Anthony 以获得提示。
2021-03-18 23:55:06
你不能用slice()吗?它在我的快速 IE7 测试中对我有用。
2021-03-19 23:55:06
该死的IE浏览器。它什么时候会死?
2021-03-24 23:55:06
@ahnbizcad 您的祈祷现已得到回应。浏览器
2021-03-25 23:55:06

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

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

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

同意。我真的觉得这是提供的最高效的解决方案,因为它具有早期中止/健全性检查,它简短而简洁,它很优雅(重载字符串原型),并且 substring 似乎比启动正则表达式引擎更少占用资源。
2021-03-14 23:55:06
@BrainSlugs83 已经有几年了,但现在这个方法并不比 chakrit 上面提到的 'indexOf' 方法快,而在 Safari 下,它慢了 30%!这是一个 jsPerf 测试,用于测试大约 50 个字符的字符串的失败情况:jsperf.com/endswithcomparison
2021-03-24 23:55:06
可能应该使用===
2021-03-28 23:55:06
也喜欢这个解决方案。只是函数名拼错了。应该是“endsWith”。
2021-04-04 23:55:06

此版本避免创建子字符串,并且不使用正则表达式(此处的某些正则表达式答案可以使用;其他的已损坏):

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

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

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

为什么正则表达式方法坏了?
2021-03-16 23:55:06
如果 this.lastIndexOf() 返回 -1,您可以根据 this.length 和 str.length 找到返回 true 的情况。添加 lastIndexOf() != -1 的测试。
2021-03-21 23:55:06
@izb:尝试str+"$"用作正则表达式的比我更旧的答案已被破坏,因为它们可能不是有效的正则表达式。
2021-03-31 23:55:06