0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

正規表現のOR検索をするとSubMatchesが期待通りの出力にならない

Last updated at Posted at 2024-10-02

実例

正規表現で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])"

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?