正規表現で英字を抽出

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

Excelのワークシート関数を組み合わせて抽出する方法、VBAで1文字ずつ英字かどうかを判別する方法、そして、正規表現で英字を判別する方法などです。

ワークシート関数の場合は前提条件が必要になることや、可読性が悪いことから保守性がどうしても悪くなりますし、ぱっと見て何をやってるのか分からないことがあるため、やはり避けたいです。

ネットでは1文字ずつ判別する方法が紹介されていることが多いのですが、その方法では、ループ処理、文字判別処理、文字列連結処理、という3段階が必要になります。

しかし正規表現を利用すればループ処理と文字列連結処理は不要になり、文字判別処理だけで単純になります。そして、一番高速に動作します。

ここではその正規表現での方法を紹介します。ちなみに正規表現が分からなくてもコピペで利用できます。

事前設定

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

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

文字列から英字を抽出する関数

正規表現を利用しているためコードがとても単純になります。

ただし、少し工夫したコードになっています。

単純に英字を検索する方法であれば、「アルファベットを検索し、それらを全て抽出する」というコードになります。

しかしそれではコードが長くなるため、「英字以外の文字を””の空文字に置き換えて英字だけを残す」という方法にしています。

なお、この関数は大文字と小文字の半角英字のみを抽出します全角と半角の両方を抽出したい場合は7行目の[^a-zA-Z]を[^a-zA-Za-zA-Z]に書き換えてください。ブラウザでは分かりにくい場合もあるのですが後ろに追加しているa-zA-Zの英字は全角です。

 

文字列から英字を抽出する関数(参考版)

なお、参考として、[^a-zA-Z](英字以外を検索)ではなく[a-zA-Z](英字を検索)とした場合は以下のコードになります。実際に使う場合は処理速度が1.5倍ほど速い上の関数の方をお勧めします。

コードが長くなっている理由は、文字列の中のどこに英字があるのか事前に分からないため、英字を検索して見つかった全ての結果を連結するための処理が必要になるためです。

上のコードでは必要ありませんでしたが、文字列の中に英字が点在している場合を考慮する必要があるため、MatchCollectionクラスとMatchクラスで検索結果が複数発生している場合への対応をしています。

 

利用方法

上のFindAlphabetRegExp関数を利用するサンプルコードです。

引数に「あいうabc1234abc890DEFzZZあ」という文字列と抽出結果を返す変数を渡します。

実行結果
abcDEFzZ