7. JavaScript・VBScriptと正規表現 

   7−1  スクリプト言語
   7−2  JavaScriptと正規表現
   7−3  VBScriptと正規表現

7−1  スクリプト言語

Webページの機能性を高めるために JavaScript をはじめとする「スクリプト言語」を使うことは、 すでに普通のことになっています。
中でも VBScript は Excel や Microsoft Word のマクロを記述する言語である VBA(Visual Basic for Applications) と文法がよく似ていて互換性も高いため、Windows 関係のシステム管理や定型処理を自動化するためのスクリプトとして、 現在でも広く使われています。
JavaScript や VBScript で文字列を処理する時にも、正規表現が利用可能です。
以降の内容は、JavaScript、VBScript に関して基礎的な知識があることを前提に書き進めます。


7−2  JavaScriptと正規表現

基本の形は、以下のとおり。

検索結果文字列 = 検索をする文字列.match(/正規表現/);
置換後の文字列 = 検索をする文字列.replace(/正規表現/, 置換文字列);
 ◆ 使用例

 result1 = "New Year 2002".match(/[0-9]+/);
 result2 = "New Year 1999".replace(/[0-9]+/, "2002");

 var str = "New Year 2002";
 result3 = str.match(/[A-Za-z]+/);
  → result1 には "2002" が格納されます。
    result2 には "New Year 2002" が格納されます。
    result3 には "New" が格納されます。

ひとつの検索対象に、正規表現を複数回マッチさせることもできます。
その場合、正規表現の末尾に /……/g というふうに g オプションをつけます。 結果はカンマで区切られたひとつの文字列として返されます。
 ◆ 使用例

 result4 = "New Year 2002".match(/[A-Za-z]+/g);  
  → result4 には "New,Year" が格納されます。

使いどころとしては、例えば入力フォームに入力してもらった値を検査したり加工したりするのに便利だと思います。

◆ JavaScriptの解説おすすめ: とほほのJavaScriptリファレンス
◆ JavaScriptの正規表現一覧: ** 正規表現の対照表 **


7−3  VBScriptと正規表現

正規表現が使えるのは、VBScript 5.0 以上、簡単にいえば IE5.0 以上がインストールされている場合です。 Windows98 以降であればまず問題なく使えるでしょう。 基本の形は、以下のとおり。(1)、(2)、(3)を順次実行すると、Matchesコレクション(Matchオブジェクトの集合) に検索結果が格納されます。

(1) RegExpオブジェクト = New RegExp
(2) RegExpオブジェクト.Pattern = 正規表現文字列
(3) Matchesコレンクション = RegExpオブジェクト.Execute(検索をする文字列)
 ◆ 使用例

 Set re = New RegExp
 re.Pattern = "[A-Za-z]+"
 re.Global = True

 Set Matches = re.Execute("New Year 2001")
  → Matches(0).Value には "New" が格納されます。
  → Matches(1).Value には "Year" が格納されます。

VBScript も JavaScript同様、Webページの中に記述して様々な処理をすることができるという触れ込みなのですが、 確実に対応しているブラウザは Internet Explorer のみです。
Windows98 以降には、WSH(Windows Scripting Host)という、 テキスト形式のスクリプトを直接読み込んで実行できる環境がインストールされています。
バッチファイル 的な使い方、あるいは HTAアプリケーション からの呼び出しといった方が便利さを実感できると思うので、 そうした使い方の例を紹介しましょう。 次の例は、カレントフォルダ内にある、拡張子が .jpe または .jpeg となって いるファイルの拡張子を、.jpg に一括変更します。
テキストエディタで以下のコードを記述し、拡張子を .vbs にして保存します。

◆ スクリプトの内容
01: Set fs = CreateObject("Scripting.FileSystemObject")  
02: Set fl = fs.GetFolder(".")
03: Set fc = fl.Files
04:
05: Set rgex = New RegExp
06: rgex.Pattern = "jpe(g)?$"
07:
08: For Each f in fc
09:   oldname = f.Name
10:   If rgex.Test(oldname) Then
11:     newname = rgex.Replace(oldname, "jpg")
12:     If Not fs.FileExists(newname) Then
13:       f.Name = newname
14:     End If
15:   End If
16: Next
◆ スクリプトの解説
01: ファイルシステムオブジェクトを生成
02: カレントフォルダの情報を持ったオブジェクトを生成
03: カレントフォルダのファイルリスト情報を持ったオブジェクトを生成
05: 正規表現オブジェクトを生成
06: 検索パターン "jpe(g)?$" をセット
08: ファイルリストfc における各ファイル f について、
09:   ファイル名を oldname に格納
10:   もし oldname が正規表現"jpe(g)?$"に一致するパターンを含むなら、
11:     一致したパターンを "jpg" に置き換えた文字列を newname に格納
12:     もし newname がディスク上に既に存在するファイル名でなければ、
13:       f のファイル名を newname に変更
14:     (既存のファイル名とかぶるなら13:をとばして15:へ)
15:   (含まないなら11:〜14:をとばして16:へ)
16: (次のファイルを処理するために08:へ戻るか、ループを抜ける)

    <VBScriptファイルのアイコン>

出来上がったスクリプトファイルを、処理を実行したいフォルダにコピーし、 アイコンをダブルクリックすると即座に実行されます。
(実行後は元に戻せません。動作チェックを慎重に行ってから、実際に有用なデータで試して下さい)
"jpe(g)?$""jpg" の部分を書き換えればもちろん、 違った形のファイル名変更が可能です。 拡張子の変更だけでなく、 例えばデジカメのデータファイルの名前を規則的に一括変換するスクリプトに改造することなどもできますね。

◆ VBScriptで使える正規表現の一覧  ** 正規表現の対照表 **