ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中结束

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

示例:我有一个字符串

var str = "mystring#";

我想知道该字符串是否以 # 结尾。我怎样才能检查它?

JavaScript中有endsWith()方法吗?我的一个解决方案是获取字符串的长度并获取最后一个字符并检查它。

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


E
EscapeNetscape

更新(2015 年 11 月 24 日):

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

肖娜 -

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

TJ克劳德 -

在现代浏览器上创建子字符串并不昂贵;发布此答案时很可能是在 2010 年。如今,简单的 this.substr(-suffix.length) === 后缀方法在 Chrome 上最快,在 IE11 上与 indexOf 相同,在 Firefox 上仅慢 4%(fergetaboutit 领域):https://jsben.ch /OJzlM 当结果为 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;
    };
}

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

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

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

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

然后你可以像这样使用它

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

如果您正在检查一个常量子字符串,这很好而且很简单。
lastIndexOf 扫描所有字符串?我以为它会从头到尾搜索。
@TomBrito,lastIndexOf 仅在找不到匹配项或在开头找到匹配项时才扫描整个字符串。如果最后有匹配,那么它的工作与后缀的长度成正比。是的,当 str"asdf" 结尾时,/asdf$/.test(str) 产生真值。
@Tom Brito,这是一个正则表达式文字。语法是从 Perl 借来的。请参阅 developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… 或有关不必要的详细信息,请参阅 EcmaScript 语言规范的第 7.8.5 节。
+1 用于跨浏览器兼容性。在 Chrome 28.0.1500.72 m、Firefox 22.0 和 IE9 上测试。
P
Phillip B Oldham

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


@Anthony,嗯......所以使用.Length-1,有什么问题? if (mystring.substr(mystring.length-1) === "#") {} 在 IE 中工作得很好。
@BrainSlugs83 - 这正是问题所在:'.length-1' 语法在 IE 中有效,而 '-1' 语法无效。需要牢记这一点,所以给安东尼+1 小费。
您不能使用 slice() 吗?它适用于我的快速 IE7 测试。
吓坏了 IE。它什么时候会死?
@ahnbizcad 你的祈祷现在已经得到回应。 RIP IE
M
Michał Perłakowski

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

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

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


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

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

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

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

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


如果 this.lastIndexOf() 返回 -1,您可以遇到依赖 this.length 和 str.length 返回 true 的情况。添加一个 lastIndexOf() != -1 的测试。
为什么正则表达式方法被破坏?
@izb:尝试使用 str+"$" 作为正则表达式的比我的答案更老的答案被破坏了,因为它们可能不是有效的正则表达式。
N
Nikita Koksharov

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

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

你可以再简化一点: return str.slice(-1) === suffix;
这是最好的答案。不知道为什么它没有更多的赞成票。
A
Aniket Kulkarni

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

浏览器兼容性

https://i.stack.imgur.com/THZsd.jpg


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

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

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

一个可能的解决方法是

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

您已获得“在 Jon Skeet 答案中发现错误”徽章。有关详细信息,请参阅您的个人资料。
d
duckyflip
if( ("mystring#").substr(-1,1) == '#' )

- 或者 -

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

V
Vinicius

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

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

M
Mohammed Rafeeq
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;
}

你必须为正则表达式转义序列转义你的字符串
即使在快速语言中,正则表达式也很慢。只需检查字符串的结尾。
T
Tici

我不了解你,但是:

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

为什么是正则表达式?为什么要搞乱原型?子字符串?来吧...


因为有时候湿的时候会更好
D
Dheeraj Vepakomma

如果您使用 lodash

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

如果不使用 lodash,您可以从它的 source 借用。


A
Ashley Davis

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

http://stringjs.com/

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

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

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

npm install string

然后要求它作为 S 变量:

var S = require('string');

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


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

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

  return false;
}

如果您解释为什么您的代码可以解决问题,那就更好了。请参阅指南 How to Answer
应扫描后缀参数以查找必须转义的正则表达式。使用 indexOf 或 lastIndexOf 似乎是一个更好的选择。
如果后缀包含以下任何字符,它将不起作用:.*+?^=!:${}()[]/\
L
LahiruBandara

这么多小问题,就用这个正则表达式

var str = "我的字符串#"; var regex = /^.*#$/ if (regex.test(str)){ //如果它有一个尾随'#' }


S
ScrapCode

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

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

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

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


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

D
Dan Doyon

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

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

使用 if (!String.prototype.hasOwnProperty("endsWith")) 是最好的方法。使用 typeof,“MooTools 和其他一些 AJAX 库会搞砸你”,根据“Crockford on JavaScript - Level 7: ECMAScript 5: The New Parts”,在 15:50 分钟。
r
rmehlinger

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

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

i
immazharkhan

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

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

u
user511941

如果您不想使用 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;
}

E
Ebubekir Dirican
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)/));

M
Matthew Brown

这建立在@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 - 但可能可以调整以删除下划线依赖项。


这是一个糟糕的解决方案,如果您已经在使用下划线,则应该将此 epeli.github.io/underscore.string 添加到您的依赖项并使用它们的实现:_.str.endsWith
t
termi
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://jsperf.com/starts-ends-with/4

完全兼容 ecmascript 规范。它通过了测试


D
Daniel Nuriyev

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


A
Aniket Kulkarni

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

我找到了比我更好的解决方案。感谢大家。


Q
Quanlong

对于咖啡脚本

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

A
Arsen Khachaturyan

这是 endsWith 的实现:

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

A
Allan Pereira

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