JavaScript で文字列が特定の文字で終わっているかどうかを確認するにはどうすればよいですか?
例: 私は文字列を持っています
var str = "mystring#";
その文字列が で終わっているかどうか知りたいです#
。どうすれば確認できますか?
endsWith()
JavaScriptにメソッドはありますか?私が持っている解決策の 1 つは、文字列の長さを取得し、最後の文字を取得して確認することです。
これが最善の方法ですか、それとも他の方法がありますか?
JavaScript で文字列が特定の文字で終わっているかどうかを確認するにはどうすればよいですか?
例: 私は文字列を持っています
var str = "mystring#";
その文字列が で終わっているかどうか知りたいです#
。どうすれば確認できますか?
endsWith()
JavaScriptにメソッドはありますか?
私が持っている解決策の 1 つは、文字列の長さを取得し、最後の文字を取得して確認することです。
これが最善の方法ですか、それとも他の方法がありますか?
更新 (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
関数を使用して最速の結果を得るindexOf
スキップし、先にスキップしますまた、ネイティブ データ構造のプロトタイプに何かを詰め込みたくない場合は、スタンドアロン バージョンを次に示します。
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;
};
}
if( "mystring#".substr(-1) === "#" ) {}
さあ、これは正しいendsWith
実装です:
String.prototype.endsWith = function (s) {
return this.length >= s.length && this.substr(this.length - s.length) == s;
}
lastIndexOf
一致がない場合、使用すると不要な CPU ループが作成されるだけです。
このバージョンでは、部分文字列の作成を回避し、正規表現を使用しません (ここでのいくつかの正規表現の回答は機能しますが、他の回答は壊れています):
String.prototype.endsWith = function(str)
{
var lastIndex = this.lastIndexOf(str);
return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}
lastIndexOf
パフォーマンスが重要な場合は、部分文字列を作成するより実際に高速かどうかをテストする価値があります。(使用しているJSエンジンに依存する可能性があります...)マッチングの場合、および文字列が小さい場合は高速になる可能性があります-しかし、文字列が巨大な場合でも、全体を振り返る必要があります私たちは本当に気にしませんが:(
単一の文字をチェックするには、長さを見つけてから使用するcharAt
のがおそらく最良の方法です。
メソッドを使用したアプローチが表示されませんでしたslice
。だから私はここに置いておきます:
function endsWith(str, suffix) {
return str.slice(-suffix.length) === suffix
}
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)
return this.lastIndexOf(str) + str.length == this.length;
元の文字列の長さが検索文字列の長さよりも 1 短く、検索文字列が見つからない場合は機能しません。
lastIndexOf が -1 を返す場合、検索文字列の長さを追加すると、元の文字列の長さが残ります。
可能な修正は
return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length
if( ("mystring#").substr(-1,1) == '#' )
- または -
if( ("mystring#").match(/#$/) )
あなたのことはわかりませんが、
var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!
なぜ正規表現?なぜプロトタイプをいじるのですか?サブスト?さあ...
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;
}
私はちょうどこの文字列ライブラリについて学びました:
js ファイルをインクルードしてから、次のS
ように変数を使用します。
S('hi there').endsWith('hi there')
インストールすることで、NodeJS でも使用できます。
npm install string
S
次に、それを変数として要求します。
var S = require('string');
Web ページには、別の文字列ライブラリへのリンクもあります (これが気に入らない場合)。
この質問には何年もかかりました。最も投票されたチャクリットの回答を使用したいユーザーに重要な更新を追加させてください.
「endsWith」関数は、ECMAScript 6 の一部として JavaScript に既に追加されています (実験的技術)
ここを参照してください: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
したがって、回答に記載されているように、ネイティブ実装の存在のチェックを追加することを強くお勧めします。
これらの長い回答の集計の後、このコードはシンプルで理解しやすいことがわかりました!
function end(str, target) {
return str.substr(-target.length) == target;
}
function check(str)
{
var lastIndex = str.lastIndexOf('/');
return (lastIndex != -1) && (lastIndex == (str.length - 1));
}
将来の証明および/または既存のプロトタイプの上書きを防止する方法は、String プロトタイプに既に追加されているかどうかを確認するテスト チェックです。これが、非正規表現の高評価バージョンに対する私の見解です。
if (typeof String.endsWith !== 'function') {
String.prototype.endsWith = function (suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -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;
}
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)/));
それらはすべて非常に役立つ例です。追加String.prototype.endsWith = function(str)
すると、メソッドを呼び出して、文字列がそれで終わるかどうかを確認するだけで済みます。正規表現も同様です。
私よりも良い解決策を見つけました。みんな、ありがとう。
コーヒースクリプトの場合
String::endsWith = (suffix) ->
-1 != @indexOf suffix, @length - suffix.length
正規表現は使用しないでください。速い言語でも遅いです。文字列の終わりをチェックする関数を書くだけです。このライブラリには、優れた例があります: groundjs/util.js。関数を String.prototype に追加する場合は注意してください。このコードには、それを行う方法の優れた例があります: groundjs/prototype.js 一般に、これは優れた言語レベルのライブラリです: groundjs また、lodash を参照することもできます。
これは、@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 が必要ですが、おそらくアンダースコアの依存関係を削除するように調整できます。
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;
}
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
;
};
}
利点: