1135

JavaScript で文字列が特定の文字で終わっているかどうかを確認するにはどうすればよいですか?

例: 私は文字列を持っています

var str = "mystring#";

その文字列が で終わっているかどうか知りたいです#。どうすれば確認できますか?

  1. endsWith()JavaScriptにメソッドはありますか?

  2. 私が持っている解決策の 1 つは、文字列の長さを取得し、最後の文字を取得して確認することです。

これが最善の方法ですか、それとも他の方法がありますか?

4

31 に答える 31

1779

更新 (2015 年 11 月 24 日):

この回答は、もともと 2010 年 (6 年前) に投稿されたものであるため、これらの洞察に満ちたコメントに注意してください。

Google 社員向けの更新 - ECMA6 でこの機能が追加されたようです。MDN の記事にもポリフィルが示されています。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そして、結果が false の場合は全体的に高速です: jsperf.com/endswith-stackoverflow-when-false もちろん、ES6 では、endsWith が追加されているので、問題はありません。:-)


元の答え:

私はこれが1年前の質問であることを知っています...しかし、私もこれが必要であり、クロスブラウザで動作する必要があるので...みんなの答えとコメントを組み合わせて少し単純化します:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • 部分文字列を作成しません
  • ネイティブindexOf関数を使用して最速の結果を得る
  • の 2 番目のパラメーターを使用して不要な比較を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;
    };
}
于 2010-03-30T19:40:46.977 に答える
94
  1. 残念ながら違います。
  2. if( "mystring#".substr(-1) === "#" ) {}
于 2008-11-11T11:20:53.450 に答える
68

さあ、これは正しいendsWith実装です:

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

lastIndexOf一致がない場合、使用すると不要な CPU ループが作成されるだけです。

于 2009-09-27T08:34:28.957 に答える
57

このバージョンでは、部分文字列の作成を回避し、正規表現を使用しません (ここでのいくつかの正規表現の回答は機能しますが、他の回答は壊れています):

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

lastIndexOfパフォーマンスが重要な場合は、部分文字列を作成するより実際に高速かどうかをテストする価値があります。(使用しているJSエンジンに依存する可能性があります...)マッチングの場合、および文字列が小さい場合は高速になる可能性があります-しかし、文字列が巨大な場合でも、全体を振り返る必要があります私たちは本当に気にしませんが:(

単一の文字をチェックするには、長さを見つけてから使用するcharAtのがおそらく最良の方法です。

于 2008-11-11T11:58:11.957 に答える
28

メソッドを使用したアプローチが表示されませんでしたslice。だから私はここに置いておきます:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}
于 2015-06-09T07:17:39.837 に答える
19

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 言語仕様第 6 版 (ECMA-262)

ブラウザの互換性

ブラウザの互換性

于 2014-03-05T14:57:39.703 に答える
17
return this.lastIndexOf(str) + str.length == this.length;

元の文字列の長さが検索文字列の長さよりも 1 短く、検索文字列が見つからない場合は機能しません。

lastIndexOf が -1 を返す場合、検索文字列の長さを追加すると、元の文字列の長さが残ります。

可能な修正は

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length
于 2009-03-04T15:58:04.537 に答える
12
if( ("mystring#").substr(-1,1) == '#' )

- または -

if( ("mystring#").match(/#$/) )
于 2008-11-11T11:26:44.967 に答える
8

あなたのことはわかりませんが、

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

なぜ正規表現?なぜプロトタイプをいじるのですか?サブスト?さあ...

于 2013-05-02T08:01:18.780 に答える
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;
}
于 2012-10-17T10:55:25.637 に答える
7

lodashを使用している場合:

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

lodash を使用しない場合は、そのソースから借りることができます。

于 2015-03-02T10:34:41.213 に答える
6

私はちょうどこの文字列ライブラリについて学びました:

http://stringjs.com/

js ファイルをインクルードしてから、次のSように変数を使用します。

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

インストールすることで、NodeJS でも使用できます。

npm install string

S次に、それを変数として要求します。

var S = require('string');

Web ページには、別の文字列ライブラリへのリンクもあります (これが気に入らない場合)。

于 2014-04-29T10:20:02.690 に答える
4

この質問には何年もかかりました。最も投票されたチャクリットの回答を使用したいユーザーに重要な更新を追加させてください.

「endsWith」関数は、ECMAScript 6 の一部として JavaScript に既に追加されています (実験的技術)

ここを参照してください: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

したがって、回答に記載されているように、ネイティブ実装の存在のチェックを追加することを強くお勧めします。

于 2015-04-30T06:56:04.903 に答える
2

これらの長い回答の集計の後、このコードはシンプルで理解しやすいことがわかりました!

function end(str, target) {
  return str.substr(-target.length) == target;
}
于 2016-02-28T10:51:15.653 に答える
2
function check(str)
{
    var lastIndex = str.lastIndexOf('/');
    return (lastIndex != -1) && (lastIndex  == (str.length - 1));
}
于 2010-06-16T14:19:02.577 に答える
2

将来の証明および/または既存のプロトタイプの上書きを防止する方法は、String プロトタイプに既に追加されているかどうかを確認するテスト チェックです。これが、非正規表現の高評価バージョンに対する私の見解です。

if (typeof String.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}
于 2011-07-18T21:46:08.550 に答える
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;
}
于 2011-05-02T07:41:13.567 に答える
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)/));
于 2012-06-22T15:06:02.620 に答える
0

それらはすべて非常に役立つ例です。追加String.prototype.endsWith = function(str)すると、メソッドを呼び出して、文字列がそれで終わるかどうかを確認するだけで済みます。正規表現も同様です。

私よりも良い解決策を見つけました。みんな、ありがとう。

于 2008-11-11T11:54:56.503 に答える
0

コーヒースクリプトの場合

String::endsWith = (suffix) ->
  -1 != @indexOf suffix, @length - suffix.length
于 2014-10-23T09:40:10.670 に答える
0

正規表現は使用しないでください。速い言語でも遅いです。文字列の終わりをチェックする関数を書くだけです。このライブラリには、優れた例があります: groundjs/util.js。関数を String.prototype に追加する場合は注意してください。このコードには、それを行う方法の優れた例があります: groundjs/prototype.js 一般に、これは優れた言語レベルのライブラリです: groundjs また、lodash を参照することもできます。

于 2014-01-05T02:03:46.693 に答える
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);
        }
    };
}

これには underscorejs が必要ですが、おそらくアンダースコアの依存関係を削除するように調整できます。

于 2013-06-15T06:33:56.580 に答える
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;
}
于 2016-02-17T15:30:12.373 に答える
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
        ;
    };
}

利点:

于 2013-07-11T13:40:16.500 に答える