VBScriptで正規表現を使った文字列検索と置換の方法

VBScript(Visual Basic Scripting Edition)は、Microsoftが開発したスクリプト言語で、特にWindows環境での自動化やタスク処理に使用されます。

VBScriptでは、正規表現を使用して文字列の操作やパターンマッチングを効率的に行うことができます。

この記事では、VBScriptでの正規表現の基本から応用までを詳しく解説します。

正規表現の基本

正規表現(Regular Expression、RegEx)は、特定の文字列パターンを定義し、それに一致する文字列を検索したり、置換したりするための方法です。

たとえば、メールアドレスの形式を検証したり、特定のパターンに一致する部分を抽出する際に利用されます。

RegExpオブジェクトの基本

VBScriptで正規表現を扱うには、RegExpオブジェクトを使用します。このオブジェクトを使うことで、テキスト内でのパターンマッチングや置換が簡単に行えます。

Dim regEx, matches, match

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\d+"

' 大文字小文字の区別をするかどうか
regEx.IgnoreCase = True

' 全ての一致を検索するかどうか
regEx.Global = True

' 対象文字列
Dim testString
testString = "There are 123 apples and 456 oranges."

' マッチング結果を取得
Set matches = regEx.Execute(testString)

' マッチした内容を表示
For Each match In matches
    WScript.Echo match.Value
Next

上記のスクリプトでは、\d+ という正規表現パターンを使用して、数値に一致する部分をすべて検索しています。

Execute メソッドは、対象文字列中のすべての一致を Match コレクションとして返します。

正規表現の構文

VBScriptの正規表現で使用される主な構文を以下に示します。

  • .(ドット) : 任意の1文字
  • ^(キャレット) : 行の先頭
  • $(ドル記号) : 行の末尾
  • *(アスタリスク) : 直前の文字が0回以上繰り返す
  • + : 直前の文字が1回以上繰り返す
  • ? : 直前の文字が0回または1回
  • {n} : 直前の文字がn回繰り返す
  • {n,} : 直前の文字がn回以上繰り返す
  • {n,m} : 直前の文字がn回以上m回以下繰り返す
  • [abc] : a、b、cのいずれか1文字
  • [^abc] : a、b、c以外の任意の1文字
  • (abc) : グループ化、キャプチャ
  • \d : 任意の数字(0-9)
  • \D : 数字以外の任意の1文字
  • \w : 任意の英数字またはアンダースコア(a-z、A-Z、0-9、_)
  • \W : 英数字またはアンダースコア以外の任意の1文字
  • \s : 任意の空白文字(スペース、タブ、改行)
  • \S : 空白文字以外の任意の1文字
  • |(パイプ) : OR条件を表します。

正規表現の実用的な使用例

以下に、VBScriptの正規表現を使用した実用的な例をいくつか紹介します。

数字の抽出と合計

テキストからすべての数値を抽出して合計を計算することができます。

Dim text, regEx, matches, match, total

' 対象文字列
text = "The prices are 100, 250, and 399."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\d+"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチした数値を合計
total = 0
For Each match In matches
    total = total + CInt(match.Value)
Next

WScript.Echo "Total: " & total

メールアドレスの検証

正規表現を使用すると、ユーザーが入力したメールアドレスが有効な形式であるかどうかを簡単に検証できます。

Dim email, regEx

' 検証するメールアドレス
email = "example@example.com"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$"
regEx.IgnoreCase = True
regEx.Global = False

' メールアドレスの検証
If regEx.Test(email) Then
    WScript.Echo "有効なメールアドレスです。"
Else
    WScript.Echo "無効なメールアドレスです。"
End If

IPアドレスの抽出

ログファイルやネットワークデータからIPアドレスを抽出する場合に正規表現が使えます。

Dim text, regEx, matches, match

' 対象文字列
text = "Server logs: 192.168.0.1 accessed the server, followed by 10.0.0.2 and 172.16.0.3."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\b(?:\d{1,3}\.){3}\d{1,3}\b"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチしたIPアドレスを表示
For Each match In matches
    WScript.Echo match.Value
Next

URLの抽出

WebページやテキストドキュメントからURLを抽出することは、Webスクレイピングやデータ解析において非常に役立ちます。

Dim text, regEx, matches, match

' 対象文字列
text = "Visit our website at https://www.example.com or follow us on http://twitter.com/example."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "https?://[\w.-]+(?:\.[\w.-]+)+"
regEx.IgnoreCase = True
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチしたURLを表示
For Each match In matches
    WScript.Echo match.Value
Next

マークダウンリンクの解析

マークダウン形式のリンクを解析し、リンクテキストとURLを抽出する場合に正規表現を使用できます。

Dim markdown, regEx, matches, match

' 対象マークダウンデータ
markdown = "You can find more information [here](https://www.example.com) and also [there](http://another-example.com)."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\[([^\]]+)\]\((https?://[^\)]+)\)"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(markdown)

' マッチした内容を表示
For Each match In matches
    WScript.Echo "Link Text: " & match.SubMatches(0) & ", URL: " & match.SubMatches(1)
Next

XMLタグの抽出

XMLデータから特定のタグの内容を抽出する場合に正規表現が使えます。

Dim xmlContent, regEx, matches, match

' 対象XMLデータ
xmlContent = "<note><to>Tove</to><from>Jani</from><body>Don't forget me this weekend!</body></note>"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "<to>([^<]+)</to>"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(xmlContent)

' マッチした内容を表示
For Each match In matches
    WScript.Echo "To: " & match.SubMatches(0)
Next

HTMLタグの除去

Webページからテキストを抽出する際に、HTMLタグを除去するために正規表現を使用できます。

Dim htmlContent, regEx, cleanText

' 対象HTML文字列
htmlContent = "<html><body><h1>Hello, World!</h1><p>This is a sample text.</p></body></html>"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "<.*?>"
regEx.IgnoreCase = True
regEx.Global = True

' HTMLタグを除去
cleanText = regEx.Replace(htmlContent, "")

WScript.Echo cleanText

任意のHTML属性の抽出

HTMLタグの特定の属性値を抽出する場合に正規表現が役立ちます。

例えば、以下はすべての画像タグの src 属性を抽出する例です。

Dim htmlContent, regEx, matches, match

' 対象HTML文字列
htmlContent = "<img src='image1.jpg' alt='Image 1'><img src='image2.png' alt='Image 2'>"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "<img[^>]*src=['""]([^'""]+)['""][^>]*>"
regEx.IgnoreCase = True
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(htmlContent)

' マッチしたsrc属性を表示
For Each match In matches
    WScript.Echo match.SubMatches(0)
Next

タグ付きテキストの抽出

例えば、ログファイルにタグ付きのテキストが含まれている場合、そのタグ付きテキストを抽出することができます。

Dim logData, regEx, matches, match

' ログデータ
logData = "[INFO] Application started. [DEBUG] Initializing modules. [ERROR] Module failed to load."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (タグ付きテキストを抽出)
regEx.Pattern = "\[(\w+)\] ([^[]+)"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(logData)

' マッチした内容を表示
For Each match In matches
    WScript.Echo "Tag: " & match.SubMatches(0) & ", Message: " & match.SubMatches(1)
Next

CSSカラーコードの抽出

スタイルシートからカラーコードを抽出する場合に正規表現が役立ちます。

Dim cssContent, regEx, matches, match

' CSSデータ
cssContent = "body { color: #333333; background-color: #FFFFFF; }"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (カラーコードを抽出)
regEx.Pattern = "#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(cssContent)

' マッチしたカラーコードを表示
For Each match In matches
    WScript.Echo "Color Code: " & match.Value
Next

ログファイルの解析

サーバーログやアプリケーションログから特定の情報を抽出するために正規表現を使用できます。

例えば、以下は特定の日付形式のエントリを抽出する例です

Dim logData, regEx, matches, match

' ログファイルの内容
logData = "2024-06-07 12:34:56 Error: Something went wrong." & vbCrLf & _
          "2024-06-08 14:22:11 Info: All systems operational." & vbCrLf & _
          "2024-06-07 16:45:02 Warning: High memory usage."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "2024-06-07 \d{2}:\d{2}:\d{2} .+"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(logData)

' マッチした内容を表示
For Each match In matches
    WScript.Echo match.Value
Next

ファイルパスの抽出

テキストからファイルパスを抽出する場合、正規表現が役立ちます。

Dim text, regEx, matches, match

' 対象文字列
text = "Configuration files are located at C:\config\settings.ini and D:\data\output.log."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "[a-zA-Z]:\\[\\\w\s.-]+"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチしたファイルパスを表示
For Each match In matches
    WScript.Echo match.Value
Next

CSVデータの解析

CSV形式のデータを解析し、各フィールドを抽出する場合に正規表現が有効です。

Dim csvData, regEx, matches, match

' 対象CSVデータ
csvData = "name,age,city" & vbCrLf & "Alice,30,New York" & vbCrLf & "Bob,25,Los Angeles"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "([^,]+),([^,]+),([^,]+)"
regEx.IgnoreCase = False
regEx.Global = True

' 各行をマッチング
Set matches = regEx.Execute(csvData)

' マッチした内容を表示
For Each match In matches
    WScript.Echo "Name: " & match.SubMatches(0) & ", Age: " & match.SubMatches(1) & ", City: " & match.SubMatches(2)
Next

クォートされたテキストの抽出

ダブルクォートまたはシングルクォートで囲まれたテキストを抽出する場合に正規表現を使用します。

Dim text, regEx, matches, match

' 対象文字列
text = "'Single quoted text' and \"double quoted text\"."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (クォートされたテキストを抽出)
regEx.Pattern = """([^""]*)""|'([^']*)'"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチした内容を表示
For Each match In matches
    If match.SubMatches(0) <> "" Then
        WScript.Echo "Double Quoted: " & match.SubMatches(0)
    Else
        WScript.Echo "Single Quoted: " & match.SubMatches(1)
    End If
Next

ネストされたカッコ内のテキストの抽出

ネストされたカッコ内のテキストを抽出する場合に正規表現を使用します。

Dim text, regEx, matches, match

' 対象文字列
text = "Function call example(func1(arg1, arg2), func2(arg3, arg4))"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (ネストされたカッコ内のテキストを抽出)
regEx.Pattern = "\(([^()]*)\)"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチした内容を表示
For Each match In matches
    WScript.Echo "Text inside parentheses: " & match.SubMatches(0)
Next

日付形式の変換

日付形式の変換は、データの一貫性を保つために重要です。

以下の例では、YYYY-MM-DD形式の日付をMM/DD/YYYY形式に変換しています。

Dim dateStr, regEx, result

' 対象文字列
dateStr = "2024-06-07"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "(\d{4})-(\d{2})-(\d{2})"
regEx.IgnoreCase = False
regEx.Global = False

' 日付形式を変換 (YYYY-MM-DD -> MM/DD/YYYY)
result = regEx.Replace(dateStr, "$2/$3/$1")

WScript.Echo result

日付のバリデーション

ユーザー入力の日付が有効な形式(例えば、MM/DD/YYYY)であるかどうかを検証する場合に正規表現を使用します。

Dim dateStr, regEx

' 検証する日付
dateStr = "06/07/2024"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (MM/DD/YYYY)
regEx.Pattern = "^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/\d{4}$"
regEx.IgnoreCase = False
regEx.Global = False

' 日付のバリデーション
If regEx.Test(dateStr) Then
    WScript.Echo "有効な日付です。"
Else
    WScript.Echo "無効な日付です。"
End If

時間のバリデーション

ユーザー入力の時間が有効な形式(例えば、HH)であるかどうかを検証する場合に正規表現を使用します。

Dim timeStr, regEx

' 検証する時間
timeStr = "14:30"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定 (HH:MM)
regEx.Pattern = "^([01][0-9]|2[0-3]):([0-5][0-9])$"
regEx.IgnoreCase = False
regEx.Global = False

' 時間のバリデーション
If regEx.Test(timeStr) Then
    WScript.Echo "有効な時間です。"
Else
    WScript.Echo "無効な時間です。"
End If

電話番号のフォーマット変更

以下の例では、標準的な電話番号形式(123-456-7890)を国際形式(+1-123-456-7890)に変換します。

Dim phoneNumber, regEx, result

' 対象文字列
phoneNumber = "123-456-7890"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "(\d{3})-(\d{3})-(\d{4})"
regEx.IgnoreCase = False
regEx.Global = False

' 電話番号のフォーマットを変更
result = regEx.Replace(phoneNumber, "+1-$1-$2-$3")

WScript.Echo result

ISBNの抽出

テキストからISBN番号を抽出する場合に正規表現が使えます。

Dim text, regEx, matches, match

' 対象文字列
text = "Here are some ISBNs: 978-3-16-148410-0 and 0-306-40615-2."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\b\d{1,5}-\d{1,7}-\d{1,7}-[\dX]\b"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(text)

' マッチしたISBNを表示
For Each match In matches
    WScript.Echo match.Value
Next

クレジットカード番号のマスキング

クレジットカード番号を安全のためにマスキングする場合に正規表現が役立ちます。

Dim text, regEx, result

' 対象文字列
text = "Credit card number: 1234-5678-9876-5432"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "\b\d{4}-\d{4}-\d{4}-\d{4}\b"
regEx.IgnoreCase = False
regEx.Global = False

' クレジットカード番号をマスキング
result = regEx.Replace(text, "****-****-****-****")

WScript.Echo result

パスワードポリシーの検証

入力されたパスワードがポリシーに準拠しているかどうかを確認する場合に正規表現が役立ちます。

例えば、以下は8文字以上で、少なくとも1つの大文字、1つの小文字、1つの数字、および1つの特殊文字を含むパスワードを検証する例です。

Dim password, regEx

' 対象パスワード
password = "P@ssw0rd!"

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$"
regEx.IgnoreCase = False
regEx.Global = False

' パスワードポリシーの検証
If regEx.Test(password) Then
    WScript.Echo "有効なパスワードです。"
Else
    WScript.Echo "無効なパスワードです。"
End If

ユーザー名の抽出

ログファイルやシステムメッセージから特定のユーザー名を抽出する場合に正規表現が役立ちます。

Dim logData, regEx, matches, match

' ログデータ
logData = "User alice logged in at 10:45. User bob logged out at 11:00."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "User (\w+)"
regEx.IgnoreCase = False
regEx.Global = True

' マッチング結果を取得
Set matches = regEx.Execute(logData)

' マッチしたユーザー名を表示
For Each match In matches
    WScript.Echo "User: " & match.SubMatches(0)
Next

特定の単語を置換

正規表現を使用して、文字列中の特定の単語を他の単語に置換することができます。

Dim text, regEx, result

' 対象文字列
text = "The quick brown fox jumps over the lazy dog."

' RegExpオブジェクトの作成
Set regEx = New RegExp

' 正規表現パターンの設定
regEx.Pattern = "fox"
regEx.IgnoreCase = True
regEx.Global = True

' 単語を置換
result = regEx.Replace(text, "cat")

WScript.Echo result

演習問題

VBScriptの基本を確認するための演習問題を紹介します。以下の問題を解いて、VBScriptの理解を深めましょう。

演習1

正規表現を使って、入力された文字列が郵便番号(例: 123-4567)の形式に一致するかを検証するVBScriptコードを作成してください。

演習1 解答例
Dim objRegExp, strZip, blnMatch
Set objRegExp = New RegExp

' 郵便番号のパターン
objRegExp.Pattern = "^\d{3}-\d{4}$"
objRegExp.IgnoreCase = True

' テストする郵便番号
strZip = "123-4567"

' パターンマッチングを行う
blnMatch = objRegExp.Test(strZip)

If blnMatch Then
    MsgBox "郵便番号の形式は正しいです。"
Else
    MsgBox "郵便番号の形式が正しくありません。"
End If

演習2

入力されたテキストの中からすべての電話番号(例: 090-1234-5678)を抽出し、それらをリストとして表示するVBScriptコードを作成してください。

演習2 解答例
Dim objRegExp, colMatches, strInput, strPhone, i
Set objRegExp = New RegExp

' 電話番号のパターン
objRegExp.Pattern = "\b\d{2,4}-\d{2,4}-\d{4}\b"
objRegExp.Global = True

' 検索するテキスト
strInput = "連絡先: 090-1234-5678 または 03-9876-5432"

' マッチした電話番号を取得
Set colMatches = objRegExp.Execute(strInput)

' 結果を表示
For i = 0 To colMatches.Count - 1
    strPhone = colMatches(i).Value
    MsgBox "電話番号: " & strPhone
Next

まとめ

正規表現は非常に強力で柔軟なツールであり、VBScriptにおける文字列操作やデータ解析に多くの可能性を提供します。

この記事で紹介した実用的な使用例を通じて、さまざまなシナリオで正規表現を活用する方法を学びました。

基本的なパターンから始め、徐々に複雑なパターンや応用例に挑戦することで、正規表現のスキルを磨きましょう。

正規表現の理解と適用は、データ処理やテキスト解析の効率を大幅に向上させることができます。