Javascript/正規表現

改行にもマッチさせる

通常の文字なんでもという場合はこのような正規表現をよく書くが

/.*/

これでは改行文字はヒットしないので複数行ある文字列に対しては行末でマッチが途切れてしまう。

このような場合はこのように記述すると改行にもマッチするようになる

/[\s\S]*/

match メソッド

JavaScriptで正規表現を使うにはStringオブジェクトのmatchメソッドを使うか、RegExpオブジェクトのexecメソッドを使う

戻り値は・・・結果情報を拡張してつめられた特殊な配列オブジェクトになる。文字列が戻ると書いてあるサイトが多いが大嘘で、特異配列オブジェクトが戻る

各プロパティ(g オプションなし)

index 原文文字列オブジェクト上のヒットしたindex位置
[n] [0]にヒットした文字列そのもの[1]以降にはキャプチャした内容が入る
input 原文文字列

各プロパティ(g オプションあり)

index なし
[n] ヒットした文字列そのものが入る。ヒットした順に入る。逆にキャプチャ情報は無い
input 原文文字列

マッチしなければnullが戻る。

RegExpオブジェクト

JavaScriptにはあらかじめ正規表現オブジェクトが用意されている。

正規表現風記述の文字列から正規表現オブジェクトを生成することができる。 正規表現を動的に生成したい場合は便利。

var hoge = new RegExp("^ho\\sge");

しかし注意しないといけない部分は、正規表現自体を文字列で与えているので、JavaScriptの文字列リテラルの制限をうけること。 Javascriptの文字列リテラルでの特殊文字はJavascriptの流儀でエスケープし、さらに正規表現上の特殊文字は正規表現の流儀で適宜エスケープしてやる必要があるので頭がこんがらがる。注意。

オプションをつけるには第二引数に文字列で指定する

var hoge = new RegExp("^hoge$", "gm");

リテラル表記

JavaScriptでは正規表現自体はオブジェクトで

var r = new RegExp('hoge');
alert('hogemoge'.match(r));

このように使うが・・・このオブジェクトにも文字列オブジェクトのようにリテラル表記がある。 正規表現オブジェクトはスラッシュで挟むことによって生成できる。

alert('hoge'.match(/hoge/));

スラッシュ自体はバックスラッシュでエスケープする。

オプション

ここらへんは通常の正規表現と同じ

大文字小文字無視オプション

大文字小文字を無視してヒットする。

/hoge/i

グローバルオプション

通常では左側からサーチして1度でもヒットしたらそこで終了。

/hoge/g

gオプションを付けると何度でもヒットするようになる。

マルチラインオプション

/hoge/m

ハット^とドル$が、行頭と行末にもヒットするようになる。

わかりにくいんだけど、改行交じりの長い文章を相手にする場合、ハットとドルは文章の一番頭と文章の一番ケツにしかヒットしない。

マルチラインオプションをつけるとこの2箇所に加え、ドルが改行直後、ハットが改行直後直後(ドル直後)にもヒットするようになる。 これにgオプションを組み合わせると複数行の文字列を一括処理できるようになる。

このオプションを使う注意点としては、正規表現としてハット^とドル$を最初と最後につけておけば、1行単位で処理できると思い込んでしまう点だ。

mオプションでハット^とドル$の意味あいが変わるだけであって他の正規表現はm無しと同じように振る舞うということ。

つまり

/^hogehog[^e]+$/

みたいな場合+が先に評価されるので行末を飲み込んでしまい結果的に複数行に対する処理になってしまう点だ。

このような場合

/^hogehog[^e]+?$/

として結果を行内に閉じ込めると行単位の処理ができるようになる。

キャプチャ有りの複数箇所ヒット

正規表現で複数箇所ヒットさせるには g オプションをつける必要があるのだが、JavaScript のメソッドでは g オプションをつけると、キャプチャ済みの値にアクセスする手段がなくなってしまう。

これがベストかどうかわからんが、 replace メソッドは引数にヒット対象に対する操作をできる関数を渡すことができるのでこれにクロージャ等で外部へ値を持ち出せばキャプチャ有りの複数箇所ヒットの処理が書ける。

関連ページ

参考サイト

バージョン

タグ

javascript/ope/string_ope/regexp/start.txt · 最終更新: 2019-06-19 10:27 by ore