おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

JavaScriptの正規表現関連メソッド

サイ本11章をざっくり読みました。流し読んだ感じでは、JavaScript正規表現RubyPerlとほぼ同じ仕様ですね。他言語との細かい違いはまた今度調べるとして、とりあえずJavaScript正規表現関連メソッドについてまとめたので載せときます。

基礎

正規表現RegExpオブジェクトによって表現されます。作り方には、コンストラクタを使う方法と、正規表現リテラルを使う方法があります。

var a = new RegExp("hoge", "g"); // コンストラクタ
var b = /hoge/g; // リテラル

Stringオブジェクトのメソッド

search()

マッチした場合、先頭の文字位置を示す番号を返します。マッチしなかったら-1を返します。引数が正規表現でない場合、引数はRegExpコンストラクタに渡されます。

replace()

マッチしたものを第二引数で指定した文字列に置き換えます。第二引数に関数を指定して、置換文字列を動的に変更できるようです。

// 文字列の全ての単語の最初の文字列を大文字にする例
text.replace(/\b\w\b/g, function(word) {
  return word.substring(0, 1) .toUpperCase() + word.substring(1);
});
match()

マッチした場合、マッチした結果を格納した配列を返します。RegExpオブジェクトにgフラグがあった場合は、マッチした全ての配列を返します。gフラグがなかった場合は、配列の0番目の要素に一致した文字列を格納し、次の要素からは括弧でくくられた部分の文字列を格納します。

split()

指定された引数を区切り文字として使用し、文字列を分割します。

RegExpオブジェクトのメソッド

exec()

マッチした場合は、配列を返します。配列は、matchでgフラグがなかったときの形式と同じです。RegExpオブジェクトにgフラグを設定した場合は、一致した文字列の直後の文字位置をlastIndexプロパティに格納します*1。この時にexec()メソッドを呼び出すと、lastIndexプロパティが示す文字位置から検索を開始します。なので、exec()メソッドでマッチした全ての配列を返すようにするにはループを使って複数回exec()メソッドを実行してあげる必要があります。

test()

マッチした場合にtrueを返す以外はexec()メソッドと同じです。

RegExpオブジェクトのプロパティ

sourceプロパティ

正規表現の本体である文字列が格納されているプロパティ。読み出し専用。

globalプロパティ

gフラグが設定されているかどうかが格納されているプロパティ。読み出し専用。

ignoreCaseプロパティ

iフラグが設定されているかどうかが格納されているプロパティ。読み出し専用。

multilineプロパティ

mフラグが設定されているかどうかが格納されているプロパティ。読み出し専用。

lastIndexプロパティ

exec()メソッドとtest()メソッドの際に使用される、次に検索を開始する文字位置を格納するプロパティ。globalプロパティがtrueの時のみ有効。読み書き可能。

*1:一致した文字列がなければlastIndexは0になります