JavaScriptで文字列が特定の文字で終了しているかどうかを確認するにはどうすればよいですか?
例:文字列があります
var str = "mystring#";
その文字列がで終わるかどうかを知りたい#
。どうすれば確認できますか?
endsWith()
JavaScriptにメソッドはありますか?私が持っている1つの解決策は、文字列の長さを取り、最後の文字を取得してそれをチェックすることです。
これは最善の方法ですか、それとも他の方法がありますか?
JavaScriptで文字列が特定の文字で終了しているかどうかを確認するにはどうすればよいですか?
例:文字列があります
var str = "mystring#";
その文字列がで終わるかどうかを知りたい#
。どうすれば確認できますか?
endsWith()
JavaScriptにメソッドはありますか?
私が持っている1つの解決策は、文字列の長さを取り、最後の文字を取得してそれをチェックすることです。
これは最善の方法ですか、それとも他の方法がありますか?
回答:
更新(2015年11月24日):
この回答は元々2010年(6年前)に投稿されているため、以下の洞察に満ちたコメントに注意してください。
Shauna -Google社員向けの更新-ECMA6がこの機能を追加したようです。MDNの記事には、ポリフィルも示されています。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
TJ Crowder-部分文字列の作成は、最新のブラウザでは高価ではありません。この回答が投稿されたのは2010年のことでしょう。最近では、シンプルなthis.substr(-suffix.length) === suffix
アプローチは、のindexOfとしてIE11に同じクロム最速で、わずか4%遅く(fergetaboutit領土)のFirefox上: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;
};
}
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
と、要点は曖昧になります。:-)
/#$/.test(str)
はすべてのブラウザで機能し、モンキーパッチを必要String
とせずlastIndexOf
、一致がない場合のように文字列全体をスキャンする必要もありません。
次のような正規表現の特殊文字を含む可能性がある定数文字列に一致させる場合 '$'
場合は、次のように使用できます。
function makeSuffixRegExp(suffix, caseInsensitive) {
return new RegExp(
String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
caseInsensitive ? "i" : "");
}
そして、あなたはこのようにそれを使うことができます
makeSuffixRegExp("a[complicated]*suffix*").test(str)
lastIndexOf
一致が見つからない場合、または最初に一致が見つかった場合にのみ、文字列全体をスキャンします。最後に一致がある場合は、サフィックスの長さに比例して機能します。はい、で終わる/asdf$/.test(str)
場合str
はtrueになります"asdf"
。
if( "mystring#".substr(-1) === "#" ) {}
slice()
か?クイックIE7テストでうまくいきます。
さあ、これは正しい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
がおそらく最良の方法です。
str+"$"
正規表現として使用しようとするものよりも古い回答は、有効な正規表現ではない可能性があるため、壊れています。
return this.lastIndexOf(str) + str.length == this.length;
元の文字列の長さが検索文字列の長さより1つ短く、検索文字列が見つからない場合は機能しません。
lastIndexOfは-1を返し、検索文字列の長さを追加すると、元の文字列の長さが残ります。
可能な修正は
return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length
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
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;
}
あなたのことは知りませんが:
var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!
なぜ正規表現なのか?なぜプロトタイプをいじるのですか?substr?さあ…
私はこの文字列ライブラリについてちょうど学んだ:
jsファイルをインクルードし、次のS
ように変数を使用します。
S('hi there').endsWith('hi there')
NodeJSをインストールして使用することもできます。
npm install string
次に、それをS
変数として要求します。
var S = require('string');
Webページには、代替の文字列ライブラリへのリンクもあります(これが気に入らない場合)。
function strEndsWith(str,suffix) {
var reguex= new RegExp(suffix+'$');
if (str.match(reguex)!=null)
return true;
return false;
}
この質問は長年続いています。最も投票されたチャクリットの回答を使用したいユーザーのための重要な更新を追加しましょう。
「endsWith」関数はECMAScript 6(実験的テクノロジー)の一部としてJavaScriptにすでに追加されています
ここを参照してください: https //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
したがって、回答に記載されているように、ネイティブ実装の存在のチェックを追加することを強くお勧めします。
既存のプロトタイプの将来的な証明および/または上書きを防ぐ方法は、それがすでに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ライブラリのいくつかは、あなたを台無しにします」。
@chakritの承認された答えは、それを自分で行うための確かな方法です。ただし、パッケージソリューションを探している場合は、@ mlunoeが指摘しているように、underscore.stringを確認することをお勧めします。underscore.stringを使用すると、コードは次のようになります。
function endsWithHash(str) {
return _.str.endsWith(str, '#');
}
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)/));
これらの長い回答の集計の後で、私はこのコードがシンプルで理解しやすいことに気づきました!
function end(str, target) {
return str.substr(-target.length) == target;
}
これは、@ 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);
}
};
}
これにはアンダースコアが必要ですが、おそらくアンダースコアの依存関係を削除するように調整できます。
_.str.endsWith
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
;
};
}
利点:
正規表現は使用しないでください。速い言語でも遅いです。文字列の終わりをチェックする関数を書くだけです。このライブラリには、素敵な例があります。groundjs / util.js。String.prototypeに関数を追加するときは注意してください。このコードには、その方法の良い例があります:groundjs / prototype.js 一般に、これは素晴らしい言語レベルのライブラリです:groundjs また、lodash