JavaScriptのendsWith


1103

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

例:文字列があります

var str = "mystring#";

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

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

  2. 私が持っている1つの解決策は、文字列の長さを取り、最後の文字を取得してそれをチェックすることです。

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


5
これは関連する質問でなければなりません:stackoverflow.com/questions/646628/javascript-startswith
Hamish Grubijan

回答:


1764

更新(2015年11月24日):

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


元の回答:

私はこれが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;
    };
}

42
Google社員向けの更新-ECMA6がこの機能を追加したようです。MDNの記事には、ポリフィルも示されています。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ショーナ

2
@ lukas.pukenis最後までスキップして、最後のサフィックスのインスタンスを1つだけチェックします。検索文字列が他の場所にあるかどうかは関係ありません。
chakrit 2013

3
引数「suffix」が定義されていない状況のチェックを追加します ":if(typeof String.prototype.endsWith!== 'function'){String.prototype.endsWith = function(suffix){return this.indexOf(suffix 、this.length-((suffix && suffix.length)|| 0))!== -1;};}
Mandeep

2
あなたが言及した正規表現の合併症は何ですか?
IcedD​​ante 2014年

5
最新のブラウザでは、部分文字列の作成は高価ではありません。この回答が投稿されたのは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と、要点は曖昧になります。:-)
TJクラウダー

295
/#$/.test(str)

はすべてのブラウザで機能し、モンキーパッチを必要StringとせずlastIndexOf、一致がない場合のように文字列全体をスキャンする必要もありません。

次のような正規表現の特殊文字を含む可能性がある定数文字列に一致させる場合 '$'場合は、次のように使用できます。

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

そして、あなたはこのようにそれを使うことができます

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

10
これは、定数の部分文字列をチェックする場合に便利です。
ウォーレンブランシェ

1
lastIndexOfはすべての文字列をスキャンしますか?最後から最初まで探してみようと思いました。
トム・ブリト

3
@TomBrito、lastIndexOf一致が見つからない場合、または最初に一致が見つかった場合にのみ、文字列全体をスキャンします。最後に一致がある場合は、サフィックスの長さに比例して機能します。はい、で終わる/asdf$/.test(str)場合strはtrueになります"asdf"
マイク・サミュエル

3
@Tom Brito、これは正規表現リテラルです。構文はPerlから借用したものです。developer.mozilla.org/en/Core_JavaScript_1.5_Guide/…を参照するか、不要な詳細レベルについては、ECmaScript言語仕様のセクション7.8.5を参照してください。
Mike Samuel

2
ブラウザー間の互換性のために+1。Chrome 28.0.1500.72 m、Firefox 22.0、IE9でテスト済み。
Adrien Be

91
  1. 残念ながら違います。
  2. if( "mystring#".substr(-1) === "#" ) {}

14
@Anthony、ええと... .Length-1を使用してください。問題は何ですか?if(mystring.substr(mystring.length-1)=== "#"){}はIEで問題なく動作します。
BrainSlugs83 2011

12
@ BrainSlugs83-それはまさに問題です: '.length-1'構文はIEで機能し、 '-1'構文は機能しません。これは心に留めておくべきことなので、ヒントとしてAnthonyに+1します。
avramov

2
使えませんslice()か?クイックIE7テストでうまくいきます。
アレックス

IEをフリークします。いつ死ぬの?
ahnbizcad 2016

67

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

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

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


2
同意した。これは、早期の中止/健全性チェックがあり、簡潔で簡潔であり、エレガント(文字列プロトタイプのオーバーロード)であり、部分文字列は、正規表現エンジンを起動するよりもリソースヒットのほうがはるかに少ないようです。
BrainSlugs83 '09 / 09/20

このソリューションも好きです。関数名だけが間違っています。「endsWith」である必要があります。
xmedeko

3
@ BrainSlugs83もう2年になりますが、このメソッドは上記のchakritの「indexOf」メソッドよりも速くなく、Safariでは30%遅くなっています。以下は、約50文字の文字列を超えるエラーの場合のjsPerfテストです。jsperf.com/ endswithcomparison
ブレントファウスト

4
おそらく使用する必要が===あります。
Timmmm 2014年

56

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

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

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

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


2
this.lastIndexOf()が-1を返す場合、this.lengthとstr.lengthに応じてtrueを返す場合があります。lastIndexOf()!= -1というテストを追加します。
ebruchez 2009年

1
なぜ正規表現メソッドが壊れているのですか?
izb

2
@izb:str+"$"正規表現として使用しようとするものよりも古い回答は、有効な正規表現ではない可能性があるため、壊れています。
Jon Skeet

26

sliceメソッドでapporachが表示されませんでした。だから私はここにそのままにしておきます:

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

1
もう少し単純化できます:return str.slice(-1)=== suffix;
Erik K.

2
これが最良の答えです。なぜそれ以上の投票がないのかわからない。
2016

17
return this.lastIndexOf(str) + str.length == this.length;

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

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

可能な修正は

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

30
「ジョンスキートの回答に誤りを見つけました」バッジを獲得しました。詳細については、プロファイルを参照してください。
ボビンス2009年

17

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)

ブラウザの互換性

ブラウザの互換性



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

正規表現のエスケープシーケンスでは文字列をエスケープする必要があります
Juan Mendes

1
高速言語でも正規表現は遅いです。文字列の終わりを確認するだけです。
Daniel Nuriyev 2014年

8

あなたのことは知りませんが:

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

なぜ正規表現なのか?なぜプロトタイプをいじるのですか?substr?さあ…


'cusは時々それがWETであるときより良いです
マーティン・カポディッチ

8

正規表現を使用して、私にとって魅力のように機能する別の簡単な代替手段:

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


6

私はこの文字列ライブラリについてちょうど学んだ:

http://stringjs.com/

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

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

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

npm install string

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

var S = require('string');

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


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

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

  return false;
}

1
コードが問題を解決する理由を説明する方が良いでしょう。回答方法ガイドをご覧ください。
ブラソフィロ2014年

エスケープする必要がある正規表現については、suffix引数をスキャンする必要があります。indexOfまたはlastIndexOfを使用する方が適切なオプションのようです。
vlad_tepesch 2014年

サフィックスに次の文字が含まれている場合は機能しません:。* +?^ =!:$ {}()[] / \
gtournie

4

このような小さな問題には多くのことがあり、この正規表現を使用するだけです

var str = "mystring#";
var regex = /^.*#$/

if (regex.test(str)){
  //if it has a trailing '#'
}


4

この質問は長年続いています。最も投票されたチャクリットの回答を使用したいユーザーのための重要な更新を追加しましょう。

「endsWith」関数はECMAScript 6(実験的テクノロジー)の一部としてJavaScriptにすでに追加されています

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

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


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

2

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

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夜03時50分分で、 - 「新パーツ::ECMAScriptの5レベル7はJavaScriptのクロックフォード」によると、「MooToolsは、その他のAJAXライブラリのいくつかは、あなたを台無しにします」。
XP1 2012年

2

@chakritの承認された答えは、それを自分で行うための確かな方法です。ただし、パッケージソリューションを探している場合は、@ mlunoeが指摘しているように、underscore.stringを確認することをお勧めします。underscore.stringを使用すると、コードは次のようになります。

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

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

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)/));

1

これらの長い回答の集計の後で、私はこのコードがシンプルで理解しやすいことに気づきました!

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

1

これは、endsWithの実装です。 String.prototype.endsWith = function (str) { return this.length >= str.length && this.substr(this.length - str.length) == str; }


1

これはの実装ですendsWith

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

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

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


1
これは、この追加する必要がありますアンダースコアすでに使用しているというならば、悪いソリューションですepeli.github.io/underscore.stringをあなたの依存関係にし、その実装を使用:_.str.endsWith
mlunoe

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

利点:

  • このバージョンは、indexOfを再利用するだけではありません。
  • 長い文字列で最高のパフォーマンス。ここに速度テストがありますhttp://jsperf.com/starts-ends-with/4
  • ecmascript仕様と完全に互換性があります。それは合格テストを

0

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


0

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

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


0

coffeescriptの場合

String::endsWith = (suffix) ->
  -1 != @indexOf suffix, @length - suffix.length
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.