概要
javascriptで正規表現を取り扱うRegExpオブジェクトについて、調べてみます。
RegExpオブジェクトを使うとき、次の使い方があります。
・RegExp()コンストラクタ
・RegExpプロパティ
・RegExpメソッド
それぞれどういった使い方をするものか、順番に見ていきます。
RegExpコンストラクタについて
1つ(または2つ)の引数をもとに、RegExpオブジェクトを生成します。
正規表現を1番目の引数に指定し、2番目の引数は正規表現のフラグを書きます(省略可能)。
例として、RegExpコンストラクタの生成をしてみます。
let regcon = new RegExp("\\d", "g");
console.log(regcon);
上記のRegExpコンストラクタは数値にマッチする場合(フラグはg)を意味します。
「\」を2重に書く意図はエスケープ文字として動作する為、「\d」を正しく処理する為に2重に書きます。
また、ここで定義した「regcon」は正規表現オブジェクトとも言えます。
この正規表現オブジェクトを元に正規表現の処理を行います。
上記の例以外では、次のように書くことも可能です。
let regcon2 = new RegExp("BC", "g");
console.log(regcon2);
これは単純に文字列「AB」に対してマッチする場合の書き方です。
実際にマッチさせる場合のプログラムはこの投稿の後半にサンプルを書いてみます。(↑の記述だけでは、コンストラクタを生成しただけなので、何も処理を行いません)
RegExpプロパティについて
RegExpプロパティについて調べてみます。
javascriptのバージョンが年々アップされており、使用を推奨するプロパティと非推奨のプロパティが変化してきています。
詳しい解説は、こちらに解説されているので、詳細は割愛します。
RegExpプロトタイプオブジェクトのプロパティは次のようなものがあります。
RegExp.prototype.constructor
RegExp.prototype.flags
RegExp.prototype.dotAll
RegExp.prototype.global
RegExp.prototype.ignoreCase
RegExp.prototype.multiline
RegExp.prototype.source
RegExp.prototype.sticky
RegExp.prototype.unicode
また、非推奨のプロパティはこちらにまとめられていますので、詳細は省略します。
RegExpメソッドについて
RegExpメソッドについて、調べてみます。
メソッドというだけあって、正規表現のパターンマッチを実行する為に書きます。
RegExpのプロトタイプオブジェクトの仕様を調べてみると、次のようなものがあります。
RegExp.prototype.compile()
RegExp.prototype.exec()
RegExp.prototype.test()
RegExp.prototype[@@match]()
RegExp.prototype[@@matchAll]()
RegExp.prototype[@@replace]()
RegExp.prototype[@@search]()
RegExp.prototype[@@split]()
RegExp.prototype.toSource()
RegExp.prototype.toString()
それぞれの詳細な解説はこちらを参照するとわかりますが、
この中で頻繁に使われるものは「exec()」と「test()」です。
exec()メソッドは引数に文字列を指定してパターンマッチングを行います。
パターンマッチした場合は、match()メソッドと同様に配列を返し、
マッチしなかった場合はnullになります。
また、test()メソッドは引数に指定された文字列が、指定された正規表現とマッチするかどうかを返します。
マッチする場合はtrueを返し、しない場合はfalseを返します。
(詳しい仕様上の説明はここでは割愛します )
実際にサンプルを書いて動かしてみます
ここまでのRegExpの説明を元に簡単なサンプルを書いて動作させてみます。
次のサンプルコードを実行します。
let str3 = "abc5def";
let regcon3 = new RegExp("\\d", "g");
console.log(regcon3.test(str3));
let str4 = "abcdef";
let regcon4 = new RegExp("\\d", "g");
console.log(regcon4.test(str4));
結果は
true
false
という結果になります。
ここで出てくるtestはRegExpのメソッドとして機能します。
正規表現オブジェクトは文字列のパターンマッチングを行っています。
動作としてはmatch()となり、文字列の中に数値が含まれている場合にtrueが返ります。
では、上記の例で書いているtestメソッドをexecメソッドに変えて試してみます。
let str5 = "abc5def";
let regcon5 = new RegExp("\\d", "g");
console.log(regcon5.exec(str5));
let str6 = "abcdef";
let regcon6 = new RegExp("\\d", "g");
console.log(regcon6.exec(str6));
出力結果は次のようになります。
Array [ "5" ]
null
メソッド名の他は全て同じコードでしたが、メソッドがexecに変わった後の出力結果は異なります。
testメソッドでは文字列の検索をして存在の有無を判定結果を返していることに対し、
execメソッドでは検索でヒットした文字列を返しています。
この例と同様に、searchメソッド、replaceメソッド、splitメソッド等、RegExpオブジェクトとともに使用できるメソッドがあり、状況に応じて書きます。