web-dev-qa-db-ja.com

javaScriptでのendsWith

JavaScriptで文字列が特定の文字で終わっているかどうかをどうやって確認できますか?

例:文字列があります

var str = "mystring#";

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

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

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

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

1064
Bobby Kumar

アップデート(2015年11月24日):

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


元の答え:

私はこれが昔からの質問であることを知っています...しかし私もこれが必要で、クロスブラウザで動作させる必要があります... 全員の答えとコメントを組み合わせて そしてそれを少し単純化します。

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • 部分文字列を作成しません
  • 最速の結果を得るためにネイティブのindexOf関数を使用します
  • indexOfの2番目のパラメーターを使用して不要な比較をスキップして先にスキップします
  • 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;
    };
}
1743
chakrit
/#$/.test(str)

すべてのブラウザで動作し、モンキーパッチによるStringの適用は不要です。また、一致しない場合はlastIndexOfによる文字列全体のスキャンも不要です。

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

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

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

makeSuffixRegExp("a[complicated]*suffix*").test(str)
291
Mike Samuel
  1. 残念ながら違います。
  2. if( "mystring#".substr(-1) === "#" ) {}
86

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

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

lastIndexOfを使用しても、一致するものがなければ、不要なCPUループが発生するだけです。

66
Oskar Liljeblad

このバージョンは部分文字列を作成することを避け、そして正規表現を使用しません(ここでのいくつかの正規表現の答えはうまくいきます;他は壊れています):

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

パフォーマンスがあなたにとって重要であるならば、lastIndexOfが実際にサブストリングを作成するより速いかどうかテストする価値があるでしょう。 (それはあなたが使っているJSエンジンに依存するかもしれません。)マッチングの場合は速くなるかもしれません。私たちは本当に気にしませんが。

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

56
Jon Skeet

sliceメソッドを使ったアプローチは見られませんでした。だから私はそれをここに残しておきます。

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}
24
return this.lastIndexOf(str) + str.length == this.length;

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

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

考えられる解決策は

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

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)

ブラウザの互換性

Browser compatibility

14
Aniket Kulkarni
if( ("mystring#").substr(-1,1) == '#' )

- または -

if( ("mystring#").match(/#$/) )
9
duckyflip
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;
}
8
Mohammed Rafeeq

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

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

なぜ正規表現なのかなぜプロトタイプをめちゃくちゃにするの? substr?召し上がれ...

7
Tici

lodash :を使用している場合

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

Lodashを使用していない場合は、 source から借りることができます。

7
Dheeraj V.S.

正規表現を使用して、私にとって魅力的なもう1つの簡単な代替方法:

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

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

http://stringjs.com/ /

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

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

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

npm install string

それからS変数としてそれを必要とします:

var S = require('string');

Webページには、代替の文字列ライブラリへのリンクもあります。

6
Ashley Davis

この質問には何年もの歳月がかかりました。最も投票されているchakritの答えを使用したいユーザーのために重要なアップデートを追加しましょう。

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

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

そのため、回答で述べられているように、ネイティブ実装の存在のチェックを追加することを強くお勧めします。

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

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

  return false;
}
4
Tabish Usman

このような小さな問題には多くのことがあるので、この正規表現を使ってください。

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

if (regex.test(str)){
  //if it has a trailing '#'
}
4
LahiruBandara
function check(str)
{
    var lastIndex = str.lastIndexOf('/');
    return (lastIndex != -1) && (lastIndex  == (str.length - 1));
}
2
manish

@ chakritの受け入れられた答えはそれを自分でするための強固な方法です。ただし、パッケージ化されたソリューションを探しているのであれば、@ mlunoeが指摘したように、 underscore.string を見ることをお勧めします。 underscore.stringを使用すると、コードは次のようになります。

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

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

if (typeof String.endsWith !== 'function') {
    String.prototype.endsWith = function (suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}
2
Dan Doyon
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

これはendsWithの実装です:

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

1
Atuljssaten

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
user511941

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

1
Atuljssaten

これらの長い回答の集計の結果、このコードはシンプルで理解しやすいものでした。

function end(str, target) {
  return str.substr(-target.length) == target;
}
1
immazharkhan
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
termi

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

コーヒーの場合

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

それらはすべて非常に便利な例です。 String.prototype.endsWith = function(str)を追加することは私たちの文字列がそれで終わっているかどうかをチェックするために単にメソッドを呼び出すのに役立ちます、よくregexpもそれをします。

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

0
Bobby Kumar

これは@ 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);
        }
    };
}

これにはアンダースコアが必要です - しかしアンダースコアの依存関係を取り除くためにおそらく調整することができます。

0
Matthew Brown

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

0
Daniel Nuriyev