VBScript: 正規表現での「最長一致」と「最短一致」
VBScriptで正規表現を使って文字列を検索する場合、 「最長一致(最長マッチ)」と「最短一致(最短マッチ)」 の違いを知っておく必要があります。
- 最長一致: できるだけ長い文字列を一致させる
- 最短一致: できるだけ短い文字列を一致させる
正規表現での書き方はそれぞれ次のようになります。
- 最長一致:「.*」や「.+」
- 最短一致:「.*?」や「.+?」
「?」が付くかどうかの違いです。 最長一致は「?」を付けず、最短一致は「?」を付けます。
早速、具体的なサンプルコードで見ていきます。
最長一致
次のサンプルコードでは検索対象文字列を「bat,cat,but,cut」とし、 「c」と「t」に挟まれたパターン文字列「c.*t」を 最長一致で検索しています。
' 検索対象 str = "bat,cat,but,cut" ' パターン strPattern = "c.*t" ' RegExpオブジェクト Set objRe = New RegExp ' パターン objRe.Pattern = strPattern ' 全体を検索 objRe.Global = True ' 大文字小文字を区別しない objRe.IgnoreCase = True ' 検索 Set objMatch = objRe.Execute(str) ' 一致した数 WScript.Echo objMatch.Count ' 検索結果のループ For Each m In objMatch ' 一致した文字列を表示 WScript.Echo m.Value Next
実行結果
1 cat,but,cut
最長一致の場合は、
「c」と「t」で挟まれたできるだけ長い文字列を取得しますから、
上のような結果になります。
「cat」の「c」から「cut」の「t」までが、
「c」と「t」で挟まれた一つの文字列として返って来ます。
次は最短一致のケースを見てみます。
最短一致
検索対象は同じく「bat,cat,but,cut」とし、 「c」と「t」に挟まれたパターン文字列「c.*?t」を 最短一致で検索しています。' 検索対象 str = "bat,cat,but,cut" ' パターン strPattern = "c.*?t" ' RegExpオブジェクト Set objRe = New RegExp ' パターン objRe.Pattern = strPattern ' 全体を検索 objRe.Global = True ' 大文字小文字を区別しない objRe.IgnoreCase = True ' 検索 Set objMatch = objRe.Execute(str) ' 一致した数 WScript.Echo objMatch.Count ' 検索結果のループ For Each m In objMatch ' 一致した文字列を表示 WScript.Echo m.Value Next
実行結果
2 cat cut
最短一致のケースでは、「c」と「t」で挟まれたできるだけ短い文字列を取得しますから、 2つの文字列「cat」「cut」がヒットしました。
このように、正規表現を使う場合は 「最長一致(最長マッチ)」と「最短一致(最短マッチ)」では 結果が全然異なって来ますから、違いを把握しておく必要があります。