実例
正規表現でMM/ddの形式の日付から
ddの部分を抽出したい。
以下のようなコードを書いたとする。
Sub RegexTest()
Dim regex As Object
Dim match As Object
Dim targetStr As String
targetStr = "10/23"
' 正規表現オブジェクトを作成
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "([1-9]|1[0-2])/([1-9]|[12]\d|3[01])"
regex.Global = False
' 一致を検索
If regex.test(targetStr) Then
Set match = regex.Execute(targetStr)(0)
MsgBox match.SubMatches(1)
End If
End Sub
コードの雑な説明
regex.Patternで 1~12の数字 / 1~31の数字
になるように正規表現を書き
メッセージボックスに1番目のSubMatch、(日付の方)を出力する。
今回の例だと、targetStr
に"10/23"を代入しているので
23 が出力されるはずだ。
あれ?
実行してみると、メッセージボックスに表示されるのは「2」だった。
解決法
正規表現は、左から右に向かって「初めにヒットした条件」を基準に返している。
今回だと[1-9]
の条件に"2"がヒットするので、出力が「2」になってしまうのだろう。
なので条件の順番を以下のように変えれば期待通り「23」になる。
regex.Pattern = "(1[0-2]|[1-9])/(3[01]|[12]\d|[1-9])"