[javascript] 文字列が "StartsWith"別の文字列かどうかをチェックする方法?


Answers

.lastIndexOf別の方法:

haystack.lastIndexOf(needle, 0) === 0

これは、 haystack索引0から始まるneedle発生について、 haystackを逆向きに見ます。 つまり、 haystackneedle始まるかどうかを確認するだけです。

原則として、これには他のいくつかのアプローチよりもパフォーマンス上の利点があります。

  • haystack全体を検索するわけではありません。
  • 新しい一時文字列を作成してすぐにそれを破棄しません。
Question

どのようにC#のString.StartsWithに相当するJavaScriptを記述しますか?

var haystack = 'hello world';
var needle = 'he';

//haystack.startsWith(needle) == true

注:これは古い質問であり、ECMAScript 2015(ES6)のコメントで指摘されているように、 .startsWithメソッドが導入されました。 しかし、このアップデート(2015年)を書いている時点では、 ブラウザのサポートは完全ではありません




startsWith()endsWith()startsWith()て作業している場合は、先行スペースに注意する必要があります。 完全な例を次に示します。

var str1 = " Your String Value Here.!! "; // Starts & ends with spaces    
if (str1.startsWith("Your")) { }  // returns FALSE due to the leading spaces…
if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces…

var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`.
if (str2.startsWith("Your")) { }  // returns TRUE
if (str2.endsWith("Here.!!")) { } // returns TRUE



underscore.string.jsもチェックしてください。 これには、 startsWithメソッドを含む有用な文字列テストと操作メソッドが付属しています。 ドキュメントから:

startsWith _.startsWith(string, starts)

このメソッドは、 stringが開始でstartsかどうかをチェックしstarts

_("image.gif").startsWith("image")
=> true



ヘルパー関数がなければ、regexの.testメソッドを使うだけです:

/^He/.test('Hello world')

ハードコードされたものではなくダイナミックな文字列でこれを行うには(文字列に正規表現の制御文字が含まれていないと仮定します):

new RegExp('^' + needle).test(haystack)

JavascriptにRegExp.escape関数がありますか? regexp制御文字が文字列に現れる可能性がある場合。




これは非常に普及しているので、ECMA 6ではこのメソッドの実装があり、将来の問題や涙を防ぐために '公式'ポリフィルを使用する必要があることを前提にしておくことは価値があると思います。

幸いなことに、Mozillaの専門家は、

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

これには、ECMA 6への移行時に正常に無視されるという利点があります。




ここでは、CMSのソリューションに少し改良があります:

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

"Hello World!".startsWith("He"); // true

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

将来のブラウザがネイティブコードで実装している場合や、別のライブラリによって実装されている場合に備えて、関数がすでに存在するかどうかをチェックします。 例えば、Prototype Libraryはこの機能を既に実装しています。

使用! === 0よりも若干速くて簡潔ですが、読みやすいものではありません。




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

http://stringjs.com/

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

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

NodeJSでインストールすることによっても使用できます:

npm install string

それからそれをS変数として要求する:

var S = require('string');

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




ここでの答えに基づいて、これは私が現在使っているバージョンです.JPerfのテストに基づいて最高のパフォーマンスを発揮するようです(そして、私が知る限り機能的に完成しています)。

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

これは、ここからstartsWith2に基づいています: http://jsperf.com/startswith2/6 ://jsperf.com/startswith2/6。 私は小さなパフォーマンス改善のための小さな微調整を追加し、以来、比較文字列がnullまたは未定義であることのチェックを追加し、CMSの答えのテクニックを使用してStringプロトタイプに追加するように変換しました。

この実装では、このMozilla Developer Networkページに記載されている "position"パラメータはサポートされていませんが、ECMAScriptプロポーザルには含まれていないようです。




Related