正規表現で日本語を抽出
文字列から日本語である漢字、ひらがな、カタカナを抽出する方法にはいくつか考えられます。
文字列を1文字ずつ判定するのはかなり大変です。数字または英字または記号以外だったら日本語とみなすような処理をすることになりますが、漢字や記号の判定がとても大変です。
そこで、現実的な方法は正規表現での抽出になります。
ここではその正規表現での方法を紹介します。ちなみに正規表現が分からなくてもコピペで利用できます。
事前設定
以下のVBAコードは事前に正規表現の参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
文字列から日本語を抽出する関数
正規表現を利用しているためコードがとても単純になります。
正規表現ではひらがなは[ぁ-ん]、全角カタカナは[ァ-ヶ]、漢字は[一-龠〃々〆〇]、半角カタカナは[。-゚]になります。[^]が先頭に付くことで、^以降の文字以外、という意味になります。
正規表現での漢字の判定は処理を行う環境によって変わってきます。WindowsのVBAであれば漢字の正規表現は[一-龠〃々〆〇]で大丈夫と思いますが、もし不足があった場合は〇の右に追加してください。
これら日本語以外を検索して、見つかった文字を空文字に置き換えると、残った文字列は日本語のみとなります。
1 2 3 4 5 6 7 8 9 10 11 12 |
'// 引数1:対象文字列 '// 引数2:検索結果 Sub FindJapaneseRegExp(s, result) Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=日本語以外を抽出 reg.Pattern = "[^ぁ-んァ-ヶ一-龠〃々〆〇。-゚]" '// 文字列の最後まで検索する reg.Global = True '// 指定セルの日本語以外を空文字に置き換える result = reg.Replace(s, "") End Sub |
利用方法
上のFindJapaneseRegExp関数を利用するサンプルコードです。
引数に「あいう1234567890abc1@大中小abc月火アイウパパ祈祷師佐々木」という文字列と抽出結果を返す変数を渡します。
1 2 3 4 5 6 |
Sub FindJapaneseRegExpCallTest() Dim s Call FindJapaneseRegExp("あいう1234567890abc1@大中小abc月火アイウパパ祈祷師佐々木", s) Debug.Print s End Sub |
実行結果
あいう大中小月火アイウパパ祈祷師佐々木
祈祷師佐々木?
上のサンプルで「祈祷師佐々木」というのが出てきていますが、ふざけているのではなくこれには意味があります。
日本語を判別する正規表現は上で紹介した通りですが、Shift-JIS環境の場合は [亜-熙] とする場合があります。VBAではこの正規表現では検出できない漢字があります。それが「祈祷」などです。
また、[一-龠]では「々」などが検出できない文字があるため個別に追加しています。それらが正しく漢字として認識できるか、という意味で祈祷師佐々木さんに登場してもらってます。