VBA

【VBA】正規表現生成ツールを自作

正規表現は、テキストデータのパターンを検索や置換するために広く使用される強力な手法です。しかし、正規表現パターンを正しく記述することは、初心者にとっては難しく間違えに気づきにくいというデメリットがあります。そこで、VBAを使用して正規表現パターンを自動生成するツールを作成しました。このツールは、ユーザーが要件を選択すると、それに応じた正規表現パターンを生成し表示します。

正規表現とは

正規表現(Regular Expression)は、テキストデータ内でパターンを検索したり、特定の文字列を置換したりするための表現方法です。正規表現は、文字列のパターンを記述するための特殊な言語であり、さまざまなプログラミング言語やテキスト処理ツールで広く使用されています。

正規表現は、以下のような目的で使用されます。

  1. 文字列の検索: 特定のパターンに一致する文字列を見つけるために使用されます。例えば、ある文字列内に特定のパターンの電話番号やメールアドレスが含まれているかどうかを検索するために使用されます。
  2. 文字列の置換: 特定のパターンに一致する文字列を別の文字列に置換するために使用されます。例えば、テキスト内のすべての数値を置換したり、不適切な単語を修正するために使用されます。
  3. 入力の検証: ユーザーがフォームやウェブページに入力したデータが正しい形式であるかどうかを検証するために使用されます。例えば、メールアドレスや電話番号の入力値が有効かどうかを確認するために使用されます。

正規表現は、特殊文字やメタ文字(.、*、+、^など)を使用して、特定のパターンを記述します。これにより、非常に柔軟で複雑なパターンを表現することができます。ただし、正規表現は学習コストが高い場合があり、複雑なパターンを作成する際には注意が必要です。

作成するツールの概要

このVBAツールは、Excelのユーザーフォームを使用して実装されています。ユーザーはコンボボックスから要件を選択し、その要件に応じた正規表現パターンがテキストボックスに表示されます。また、カスタムパターンを指定するオプションも実装します。

ユーザーフォームにテキストボックスと、コンボボックスを用意してください。

正規表現自動生成ツールの実装

下記の要件に対応するツールとして実装します。

  • メールアドレス
  • 郵便番号
  • 電話番号
  • URL
  • 日付(YYYY-MM-DD形式)
  • ユーザー名(半角英数字とアンダースコアのみ)
  • 商品コード(n桁のアルファベットとn桁の数字)
  • カスタムパターン(スペース区切りで単語を入れると、すべての単語にマッチする正規表現)

まず、Excelに新しいユーザーフォームを追加し、その上にコントロールを配置します。テキストボックスやコンボボックスを使用して、ユーザーが要件を選択できるようにします。

次に、ユーザーが要件を選択すると、それに対応する正規表現を生成するVBAコードを書きます。

' フォームのコントロール
Private Sub ComboBox1_Change()
    Dim regexPattern As String
    
    ' ユーザーが選択した要件に対応する正規表現を取得
    Select Case ComboBox1.Value
        Case "メールアドレス"
            regexPattern = "^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$"
        Case "郵便番号"
            regexPattern = "^\d{3}-\d{4}$"
        Case "電話番号"
            regexPattern = "^0\d{1,4}-\d{1,4}-\d{4}$"
        Case "URL"
            regexPattern = "^(https?|ftp)://[^\s/$.?#].[^\s]*$"
        Case "日付(YYYY-MM-DD形式)"
            regexPattern = "^\d{4}-\d{2}-\d{2}$"
        Case "ユーザー名(半角英数字とアンダースコアのみ)"
            regexPattern = "^[a-zA-Z0-9_]+$"
        Case "商品コード(n桁のアルファベットとn桁の数字)"
            Dim n As Integer
            n = InputBox("商品コードの桁数を入力してください", "桁数入力")
            regexPattern = "^[a-zA-Z]{" & n & "}\d{" & n & "}$"
        Case "カスタムパターン"
            Dim customPattern As String
            customPattern = InputBox("カスタムパターンを入力してください", "カスタムパターン入力")
            regexPattern = GenerateCustomPattern(customPattern)
        Case Else
            regexPattern = ""
    End Select
    
    ' 結果を表示
    TextBox1.Value = regexPattern
End Sub

' カスタムパターンの生成
Function GenerateCustomPattern(ByVal customPattern As String) As String
    Dim words() As String
    Dim word As Variant
    Dim regexPattern As String
    
    ' スペースで区切られた単語を取得
    words = Split(customPattern, " ")
    
    ' 各単語を正規表現に追加
    For Each word In words
        regexPattern = regexPattern & word & "|"
    Next word
    
    ' 最後のパイプを削除
    regexPattern = Left(regexPattern, Len(regexPattern) - 1)
    
    ' カスタムパターンを返す
    GenerateCustomPattern = regexPattern
End Function

ユーザーが要件を選択すると、それに対応した正規表現がテキストボックスに表示されます。カスタムパターンの場合、ユーザーが指定した単語を含む正規表現が生成されます。

コードの解説

ComboBox1_Change() サブルーチン

このサブルーチンは、ユーザーがコンボボックスで要件を選択したときに呼び出されます。選択された要件に応じて、正規表現パターンが生成され、テキストボックスに表示されます。各要件には、それぞれの正規表現パターンが割り当てられています。

GenerateCustomPattern() 関数

この関数は、ユーザーが入力したカスタムパターンから正規表現パターンを生成します。ユーザーが入力した文字列をスペースで分割し、各単語を正規表現に追加します。最後に、生成された正規表現パターンを返します。

カスタマイズと利用方法

このツールは、ユーザーが簡単にカスタマイズして利用することができます。ユーザーは新しい要件を追加したり、正規表現の生成方法を変更したりすることができます。また、ユーザーはカスタムパターンを入力して、自分の要件に合った正規表現を生成することもできます。

ツールのカスタマイズ

ツールをさらに便利にするために、いくつかの機能を追加が考えられます。

  1. 正規表現の適用先の指定: ユーザーが正規表現を適用する対象を指定できるようにします。たとえば、ユーザーが「特定の列」や「特定のファイル」などを選択できるようにします。
  2. 正規表現のテスト: ユーザーが生成した正規表現をテストできる機能を追加します。これにより、ユーザーが生成した正規表現が期待どおりに機能するかどうかを確認できます。
  3. 正規表現パターンの保存: ユーザーが生成した正規表現パターンを保存できる機能を追加します。これにより、後で再利用することができます。
  4. 正規表現パターンの共有: ユーザーが生成した正規表現パターンを他のユーザーと共有できるようにします。これにより、コミュニティで正規表現パターンを共有し、相互に学び合うことができます。

これらの機能を追加することで、ユーザーがより効率的に正規表現を作成し、利用することができるようになります。

今回は、1と2の部分を実装します。
3と4については、DBを利用する方法やファイルを利用する方法など複数ありますが、今回の記事とは離れてしまうので、実装しません。

' フォームのコントロール
Private Sub ComboBox1_Change()
    Dim regexPattern As String
    
    ' ユーザーが選択した要件に対応する正規表現を取得
    Select Case ComboBox1.Value
        Case "メールアドレス"
            regexPattern = "^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,}$"
        Case "郵便番号"
            regexPattern = "^\d{3}-\d{4}$"
        Case "電話番号"
            regexPattern = "^0\d{1,4}-\d{1,4}-\d{4}$"
        Case "URL"
            regexPattern = "^(https?|ftp)://[^\s/$.?#].[^\s]*$"
        Case "日付(YYYY-MM-DD形式)"
            regexPattern = "^\d{4}-\d{2}-\d{2}$"
        Case "ユーザー名(半角英数字とアンダースコアのみ)"
            regexPattern = "^[a-zA-Z0-9_]+$"
        Case "商品コード(n桁のアルファベットとn桁の数字)"
            Dim n As Integer
            n = InputBox("商品コードの桁数を入力してください", "桁数入力")
            regexPattern = "^[a-zA-Z]{" & n & "}\d{" & n & "}$"
        Case "カスタムパターン"
            Dim customPattern As String
            customPattern = InputBox("カスタムパターンを入力してください", "カスタムパターン入力")
            regexPattern = GenerateCustomPattern(customPattern)
        Case Else
            regexPattern = ""
    End Select
    
    ' 結果を表示
    TextBox1.Value = regexPattern
End Sub

' カスタムパターンの生成
Function GenerateCustomPattern(ByVal customPattern As String) As String
    Dim words() As String
    Dim word As Variant
    Dim regexPattern As String
    
    ' スペースで区切られた単語を取得
    words = Split(customPattern, " ")
    
    ' 各単語を正規表現に追加
    For Each word In words
        regexPattern = regexPattern & word & "|"
    Next word
    
    ' 最後のパイプを削除
    regexPattern = Left(regexPattern, Len(regexPattern) - 1)
    
    ' カスタムパターンを返す
    GenerateCustomPattern = regexPattern
End Function

' 正規表現のテスト
Private Sub TestRegex_Click()
    Dim inputString As String
    Dim regexPattern As String
    Dim result As Boolean
    
    inputString = InputBox("テストする文字列を入力してください", "テスト文字列入力")
    regexPattern = TextBox1.Value
    
    result = RegExpTest(inputString, regexPattern)
    
    If result Then
        MsgBox "正規表現に一致しました。", vbInformation, "テスト結果"
    Else
        MsgBox "正規表現に一致しませんでした。", vbExclamation, "テスト結果"
    End If
End Sub

' 正規表現のテスト関数
Function RegExpTest(ByVal testString As String, ByVal pattern As String) As Boolean
    Dim regEx As Object
    
    Set regEx = CreateObject("VBScript.RegExp")
    
    With regEx
        .Pattern = pattern
        .IgnoreCase = True
        .Global = True
    End With
    
    RegExpTest = regEx.test(testString)
End Function

このコードでは、以下の機能が追加されています。

  1. 正規表現のテスト: TestRegex_Click サブルーチンが追加され、ユーザーが生成した正規表現をテストする機能が提供されています。ユーザーはテキストボックスに表示された正規表現パターンを使用して、任意の文字列をテストできます。
  2. 正規表現のテスト関数: RegExpTest 関数が追加され、実際の正規表現のテストを行うための関数が提供されています。この関数は、指定された文字列が与えられた正規表現パターンに一致するかどうかを判定し、結果をブール値で返します。

これらの機能を追加することで、ユーザーは生成した正規表現パターンを直接テストできるようになり、パターンが正しく機能しているかどうかを素早く確認できます。

まとめ

このVBAツールを使用することで、ユーザーは正規表現パターンを簡単に生成することができます。正確で効率的な正規表現パターンを生成し、テキストデータの検索や置換を行う際に役立てることができます。

皆さんも更なるカスタマイズを行い、更に便利なツールとしてご活用ください。