VB2010.NETのコードをExcel2010のVBAのコードに置き換える作業をしていますが、List1のようにVB.NETのコードには、Inports System.Text.RegularExpressions で.NET正規表現パッケージが使われて、この部分をVBAではどのように記述すればよいのでしょうか。
自分なりにList2のようにしてみましたが、Dim M As MatchのMatchの部分で「ユーザ定義型は定義されていません」というコンパイルエラーが発生します。
参照設定にはSystem.Text.RegularExpressionsが見当たりませんが何を指定すればよいのでしょうか。
Microsoft VBScript Regular Expressions 5.5のRegExpオブジェクトでは後読みができないので大変困っています。
よろしくお願いします。(Windows7)
---List1:VB.NET(正常)---------------
Option Explicit On
Option Strict On
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim SampleText As String = "今日は西暦2014年6月20日です"
Dim M As Match = Regex.Match(SampleText, "(?<=西暦)\d+")
If Not M.Success Then
Console.WriteLine("no match")
Else
Dim MatchedText As String = M.Value
Dim MatchedFrom As Integer = M.Index
Dim MatchedLen As Integer = M.Length
MsgBox("matched [" & MatchedText & "]" & _
" from char#" & MatchedFrom.ToString() & _
" for " & MatchedLen.ToString() & " chars.")
End If
End Sub
End Module
---List2:VBA(このコードではエラーになる)-----
Option Explicit
Sub test()
Dim SampleText As String
Dim M As Match
Dim R As New Regex
Dim MatchedText As String
Dim MatchedFrom As Integer
Dim MatchedLen As Integer
SampleText = "今日は西暦2014年6月20日です"
R = Regex("(?<=西暦)\d+")
M = R.Match(SampleText)
If Not M.Success Then
MsgBox ("no match")
Else
MatchedText = M.Value
MatchedFrom = M.Index
MatchedLen = M.Length
MsgBox("matched [" & MatchedText & "]" & _
" from char#" & MatchedFrom.ToString() & _
" for " & MatchedLen.ToString() & " chars.")
End If
End Sub
------------------------------------------
いい補足質問だと思います。
VBAのSubMatchesコレクションとはマッチ部分の分割利用です。
西暦も検索するがその後ろの数値のみ利用したい、という場合西暦と数値をSubMatchesコレクションし2つ目の部分を取り出し利用します。なので2つ目を取り出した時点で.NET正規表現の後方一致という位置付けになります。
.(後ろを取り出して初めてNETでいう(?<= )のこと)
-sample-
Sub aaa()
Dim re As New RegExp
Dim mc As MatchCollection
Dim m As Match
Dim i As Long
re.Pattern = "(西暦)(\d+)"
re.Global = True
Set mc = re.Execute("今日は西暦2014年6月20日です")
For Each m In mc
MsgBox m.SubMatches(1)
Next
End Sub
メッセージボックス → 2014
質問者
お礼
Microsoft VBScript Regular Expressions 5.5のRegExpオブジェクトでも後読みのようなことができるようになっただけでなく、SubMatchesコレクションを使ってマッチ部分の分割利用ができるようになり、とても参考になりました。ありがとうございました。
そのエラーは参照設定されてないだけだと思われます。
VisualBasicEditorのツール → 参照設定 → Microsoft VBScript Regular Expressions 5.5
にチェックを入れて下さい。
あと後方参照はできますよね?
SubMatchesコレクションを調べてみて下さい。
-sample-
Sub aaa()
Dim re As New RegExp
Dim mc As MatchCollection
Dim m As Match
Dim i As Long
re.Pattern = "([A-Z,a-z]+)([0-9]+)"
re.Global = True
Set mc = re.Execute("Abc123DEFGH4567ijkl890")
For Each m In mc
For i = 0 To m.SubMatches.Count - 1
MsgBox m.SubMatches(i)
Next
Next
End Sub
質問者
補足
sora1515さん
回答ありがとうございます。
いろいろ調べていたのですがよくわからないので教えてください。
SubMatchesコレクションを調べてみましたが、RegExp オブジェクトの Pattern プロパティで検索できる正規表現のパターンは
http://msdn.microsoft.com/ja-jp/library/cc392437.aspx
となっていて、後方参照はできないように思うのですが、私の見ているところが間違っていますでしょうか。
もしよろしければ、今回教えていただきました-sample-の
re.Pattern = "([A-Z,a-z]+)([0-9]+)"
Set mc = re.Execute("Abc123DEFGH4567ijkl890")
の部分を、私がご質問しているList2の例で示していただけないでしょうか。
具体的には、この部分を
Set mc = re.Execute("今日は西暦2014年6月20日です")
re.Pattern = "(?<=西暦)\d+"
のように書き直すと実行時にエラーになりますが、後方参照の正規表現を記述している
"(?<=西暦)\d+"
の部分を、どのように記述すればよろしいのでしょうか。
よろしくお願いします。
お礼
Microsoft VBScript Regular Expressions 5.5のRegExpオブジェクトでも後読みのようなことができるようになっただけでなく、SubMatchesコレクションを使ってマッチ部分の分割利用ができるようになり、とても参考になりました。ありがとうございました。