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」がヒットしました。

このように、正規表現を使う場合は 「最長一致(最長マッチ)」と「最短一致(最短マッチ)」では 結果が全然異なって来ますから、違いを把握しておく必要があります。

VBScript入門