文字列が他の文字列に含まれているかを調べるには?[JavaScript].NET TIPS

JavaScriptで、文字列中に他の文字列が含まれているかを調べるにはindexOfメソッドを使用するなど幾つかの方法がある。

» 2016年03月09日 05時00分 公開
[山本康彦BluewaterSoft/Microsoft MVP for Windows Development]
.NET TIPS
Insider.NET

 

「.NET TIPS」のインデックス

連載目次

 .NETの開発者がJavaScriptを使っていると、「こんな機能もないのか!?」と驚くことがある。そんなときの対処法を、文字列のContainsメソッド(C#/VB))を例に考えてみよう。このメソッドは、指定した部分文字列がその文字列内に存在するかどうかを判定するもので、.NET Framework 2.0から提供されている。ところがJavaScriptのStringオブジェクトにはそのようなメソッドがないのだ。どうしたらよいだろうか? 本稿では3通りの手段を紹介する。

indexOfメソッドを使う

 文字列が他の文字列に含まれているかを調べるには、StringオブジェクトのindexOfメソッドが利用できる。

 indexOfメソッドは、指定された文字列がその文字列の何文字目から始まっているかを返すものだ。例えば、「"ABCDE".indexOf("CD")」は2を返す("CD"は"ABCDE"の3番目から始まっているが、0始まりのインデックスが返されるので2となる)。また、指定された文字列が見つからなかったときは-1が返される。そこで、indexOfメソッドの返値が-1以外であれば、指定された文字列がその文字列に含まれていると判定できる(次のコード)。

var result1 = "ABCDE".indexOf("CD") !== -1;  // true
var result2 = "ABCDE".indexOf("BD") !== -1;  // false

indexOfメソッドを使う例(JavaScript)

「拡張メソッド」を作る

 .NETの場合、とあるクラスに機能が不足しているときには、拡張メソッドを作ることも選択肢に挙がるだろう。JavaScriptでも同様なことが可能である。

 JavaScriptでは任意のオブジェクトにメソッドを追加できる。prototypeプロパティに対してメソッドを定義すると、そのオブジェクトの全てのインスタンスで利用できるのだ。次のコードのようにして、Stringオブジェクトのprototypeプロパティにcontainsメソッドを追加し、それを最初から備わっているメソッドであるかのように呼び出せる。

if (!String.prototype.contains) { // containsメソッドが未定義ならば、
  // containsメソッドを定義する
  String.prototype.contains
    = function (substr) { return this.indexOf(substr) !== -1; };
}
var result1 = "ABCDE".contains("CD");  // true
var result2 = "ABCDE".contains("BD");  // false

Stringオブジェクトにcontainsメソッドを追加する例(JavaScript)

 ただし、この方法は注意して使ってほしい。.NETの拡張メソッドと同じで、乱用すると開発プロジェクトが混乱に陥りかねない。チーム内できちんと利用ルールを定めて運用してほしい。

JavaScriptの新バージョンを使う

 JavaScriptのバージョン6(正確には「ECMAScript 2015」、「C#開発者のための最新JavaScript事情」参照)では、上のcontainsメソッドに相当するincludesメソッドが追加された(次のコード)。

var result1 = "ABCDE".includes("CD");  // true
var result2 = "ABCDE".includes("BD");  // false

ECMAScript 2015のincludesメソッドを使う例(JavaScript)

 JavaScriptを実行する環境が限定できる場合には、このような新機能が使えるかどうかを調べてみるとよいだろう。

 このincludesメソッドは、Edgeや最近のFirefox/Chromeなどのブラウザで利用できる。また、UWPアプリをXAMLで作る場合はWebViewコントロールで利用できる。もちろんUWPアプリをJavaScriptで作る場合にも利用可能だ(ただしApache CordovaでUWPアプリを作る場合は利用できないようである)。

 また、実行時のパフォーマンスをよくするために、可能ならばincludesメソッドを使いたいということがあるかもしれない。そんなときは、containsメソッドのサンプルコードにあるようにして、includesメソッドが未定義のときだけ自前のincludesメソッドを定義してやればよいだろう。

まとめ

 文字列が他の文字列に含まれているかを調べるには、indexOfメソッドが利用できる。

 JavaScriptでは、既存のオブジェクトにメソッドを追加することも可能だ。.NETの拡張メソッドと似た機能であり、利用に当たって注意すべきことも同様である。また、新しいバージョンのJavaScriptでは、欲しい機能が追加されていることもある。

カテゴリ:JavaScript 処理対象:文字列
使用ライブラリ:Stringオブジェクト
関連TIPS:Visual Studioで静的HTMLページのJavaScriptコードをデバッグするには?
関連TIPS:異なるデータ型の値を比較するには?(==と===の違いを理解する)[JavaScript]


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。