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」は配列に格納されません。また、後方参照も行えません。
- 複数のsubmitボタンをonsubmitで判定する方法
- JavaScriptの時間を0パディングする方法
- JavaScriptでJSONデータを作る方法
- JavaScriptやjQueryで設定されたイベントの定義場所を調べる方法
- javascript:void(0)のまとめ
- setTimeout()やsetInterval()で引数を渡す方法
- JavaScriptのFormDataの使い方
- JavaScriptメールアドレスチェッカー
- PCのブラウザでiPhoneやAndroidのようなパスワードフォームを実現するJavaScriptライブラリ「FormTools」
- JavaScriptでフォーカスのあたっている要素を取得する「document.activeElement」
- 入力フォームの全角・半角を勝手に変換してくれるJavaScript
- JavaScriptエラーを表示・確認する方法のまとめ
- ソーシャルボタンのJavaScriptでfunctionの前に「!」がついている理由
- JavaScriptでCSSの擬似クラスを設定する方法
- JavaScriptにおける引数や配列の要素数の制限について