JavaScriptの正規表現で文字列を抜き出す「グループ化」

JavaScriptの正規表現で文字列を抜き出す「グループ化」

Posted at April 2,2013 12:33 AM
Tag:[JavaScript]

JavaScriptの正規表現で特定の文字列を抜き出す「グループ化」について解説します。

グループ化

JavaScriptで特定の文字列を抜き出して処理したいことがよくあるのですが、グループ化の使い方を忘れてネットで検索してもなかなかヒットしないので、備忘録で残しておきます(他に適切な方法があるようでしたらすいません)。

1.特定の文字列を抜き出す

まず基本として、特定の固定文字列を抜き出すには、match関数で次のように記述します。

var foo = 'abcdefg';
var bar = foo.match(/abc/);

これは変数fooに「abc」という文字が含まれていれば、変数barに

abc

が設定されます。

変数fooに「abc」という文字が含まれていない場合、変数barにnullが設定されます。

この使い方は、検索したい文字列があらかじめ決まっていて、上記のような代入文ではなく、判定文で使うケースが多いのではないかと思われます。

if (foo.match(/abc/)) {
    // ...
}

2.正規表現で不定の文字列を抜き出す

1項はすでに分かっている文字列を抜き出しましたが、不定の文字列を抜き出すには、match関数の正規表現に次のように指定します。ちなみに1項も正規表現の一種で、リテラル文字を指定しているケースです。

var foo = 'abc123defg';
var bar = foo.match(/\d+/);

正規表現に含まれる「¥d+」は、1文字以上の連続した数字だけを抜き出すためのメタキャラクタを意味し、変数barには

123

が設定されます。

この場合、単純な文字列であれば使えますが、

var foo = 'abc123def456ghi';

から「456」を抜き出したい場合には使えません。

3.グループ化を使って文字列を抜き出す

2項の例で「456」だけを抜き出したい場合、次のようにグループ化を利用します。

var foo = 'abc123def456ghi';
var bar = foo.match(/^.*\D+(\d+)\D+$/);

「(¥d+)」というカッコで括った部分がグループ化です。

この場合、変数barには配列が設定され、配列の0番目である"bar[0]"に、文字列

abc123def456ghi

が設定され、配列の1番目である"bar[1]"に、グループ化で取得した文字列

456

が設定されます。

注意点として、配列の0番目はすべての文字列が設定されるのではなく、正規表現でマッチした部分のみが設定されます。

上のサンプルで配列の0番目にすべての文字列が設定されているのは、正規表現ですべての文字にマッチするように記述しているためです。

したがって、たとえば、

var bar = foo.match(/(\d+)\D+$/);

とすれば、配列の0番目には

456ghi

だけが設定されることになります。

正規表現の部分の書き方は上記以外にも色々あると思いますので試してみてください。

4.グループ化を使って複数の文字列を抜き出す

グループ化では一度に複数の文字列を抜き出すことができます。

3項の例で、「123」と「456」を抜き出したい場合は次のように記述します。

var foo = 'abc123def456ghi';
var bar = foo.match(/^\D+(\d+)\D+(\d+)\D+$/);

配列の0番目である"bar[0]"に、文字列

abc123def456ghi

配列の1番目である"bar[1]"に、1つめのグループ化で取得した文字列

123

配列の2番目である"bar[2]"に、2つめのグループ化で取得した文字列

456

が設定されます。

5.後方参照を行わない場合のグループ化

話がちょっとそれますが、4項までで説明したグループ化は、グループに一致する文字が記憶されることで、配列への格納やいわゆる「後方参照」という技が使えます。

が、単に見やすさなどのためのグループ化を行いたいのであれば、グループ化の先頭に「?:」を付与して、記憶しないようにすることができます。

var foo = 'abc123def456ghi';
var bar = foo.match(/^\D+(?:\d+)\D+(?:\d+)\D+$/);

この場合、「123」「456」は配列に格納されません。また、後方参照も行えません。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)