正規表現で括弧内の文字列を抽出

文字列にある括弧内の文字のみを抽出する方法にはいくつか考えられます。

文字列の左から1文字ずつ判定して、左括弧を見つけてから右括弧があるまでを取得する、というのが素直な方法です。しかし、この方法ではフラグ変数が必要になることや括弧が連続する場合や括弧の組み合わせが複数ある場合に処理が複雑になってしまう欠点があります。

他にはInStr関数で括弧の開始と終了位置を判定して、Mid関数で取得する方法もあります。しかしこれも先と同様に括弧が複数ある場合の対応が面倒です。

そこで正規表現を使う方法を紹介します。上に挙げた2つの方法よりも処理は単純になり、しかも高速です。また、文字列に「aa(123)bb(9999)」のような複数の括弧の組み合わせがあっても処理は複雑にならず、「123」と「9999」の両方を取得できます。

なお、正規表現が分からなくてもコピペで使えます。


事前設定

以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。

VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。


文字列の括弧内の文字のみを抽出する関数

以下の関数は、例えば「(123)aaaa」という文字列からは、123、を配列で抽出します。

また括弧の組み合わせが複数ある「(123)aaaa(4567)bbbb(890)ccc」のような文字列からは、123、4567、890、を配列で抽出します。



コード説明

括弧内以外を検索して、それを除去すると括弧内のみが残る、という方法を採用しています。

そのための条件になるのが6行目の正規表現の検索パターンです。3つのパターンがあり、それを|でつなげています。

正規表現がややこしいのですが、これは以下の対応表の意味になり、それぞれのパターンに一致する文字列を検索する条件です。

^(.*?)\( 先頭から最初の(までの文字列
\)(.*?)\( )から(の文字列
\)(.*?).*$ 最後の)から文字列の最後まで

あとは、括弧内以外の文字列をカンマに置き換えて、先頭と終端にあるカンマを除去して、Split関数で配列化しています。


利用方法

FindInParenthesesRegExp関数の第一引数に検索したい文字列を指定し、第二引数にVariant型の配列用変数を指定します。

以下は複数の括弧がある場合と、1つの括弧がある場合と、括弧がない場合のコードです。

実行結果

以下のように括弧がある場合は括弧内の文字列を取得します。括弧がない場合は配列に何も設定されません。