正規表現のグルーピングとは?
グルーピングというのは、正規表現中にある()で囲んだプレースホルダを置いておくと、それをバッファに記憶してくれる機能の事を言います。
例えば、
/.*\/(.*?group1.*?)\/(.*?group2.*?)\// # ?は最短マッチ記号
といった正規表現に、 http://abcde/fgh/agroup1_abc/bgroup2_def/a?l=1
といった文字列を食わせると、グループの1番目に agroup1_abc が、 グループの2番目に bgroup2_def が保存されます。
取得した文字列を後々何かに使えるわけですね。
グルーピングの必要性
上記のようなグルーピングが何故必要かというと、主に速度面が挙げられます。
大量のログ等をハンドリングしているような場合に、 if 文やらwhile文やらやらでぐるぐる回して文字列操作をすると、鬼のように遅くなる場合があります。
正規表現を使用すると、基本的には低レベルコーディングの段階で最適化してやってくれている(はず)なので、速度の心配をする必要が減るのですね。
例えばマスキング
ここでは、URLの中にある重要な文字列があり、それをマスキングしたいという例を挙げます。
http://agroup/boauth/auth?authorization=aioj274_45098fjkhbl&b=d
といった文字列があったとします。
この時、
var authRegExp = /(.*auth?authorization=)(.*\&)(.*)/;
といった正規表現に食わせると、
- 1個目のグループ: URLの 全部
- 2個目のグループ: URLの authorization= まで
- 3個目のグループ: URLの 1個目のグループの終わりから&まで
- 4個目のグループ: URLの &以降
がグループ分けされて配列に格納されます。
これを 配列[1] と "XXXX&" と 配列[3] ではさんで出力すると、
http://agroup/boauth/auth?authorization=XXXX&b=d
見事に出力したくない部分がマスキングされるわけですね。
コーディング例(わかりやすいようにデバッグでHTML出力)
var authRegExp = /(.*auth\?authorization=)(.*\&)(.*)/;
var authMatch = authRegExp.exec('https://test.co.jp/auth?authorization=ekhd3jklhd:ejhnm_skjh2dk&test=go');
var OUT = 'a';
if ((authMatch !== null) && (authMatch.length > 0)) {
OUT = authMatch[1] + 'XXX&' + authMatch[3];
document.write( authMatch[0] + '<BR/>' );
document.write( authMatch[1] + '<BR/>' );
document.write( authMatch[2] + '<BR/>' );
document.write( authMatch[3] + '<BR/>' );
}
document.write( '<BR/>' );
document.write( OUT );
これを、BracketsとChromeでデバッグするとこうなります。
めでたしめでたし。