Option Explicit
' 使用 WithEvents 声明 RegExp 对象
Private WithEvents m_re As loquatRegExp.RegExp
Private m_nCalloutCount As Long
Private Sub Form_Load()
' 创建 RegExp 对象
Set m_re = New loquatRegExp.RegExp
m_nCalloutCount = 0
End Sub
Private Sub cmdTestWithEvents_Click()
On Error GoTo ErrorHandler
txtOutput.text = ""
m_nCalloutCount = 0
Log "========== 测试 WithEvents 回调 =========="
' 设置模式
m_re.Pattern = "a(?C1)b(?C2)c(?C""test"")"
m_re.EnableCallout = True
Log "模式: " & m_re.Pattern
Log "开始匹配..."
' 执行匹配
Dim matches As Object
Set matches = m_re.Execute("abc")
Log "匹配完成!"
Log "匹配数量: " & matches.Count
If matches.Count > 0 Then
Log "匹配值: " & matches.item(0).Value
End If
Log "总回调次数: " & m_nCalloutCount
' 获取统计信息
Dim stats As Object
Set stats = m_re.CalloutStats
Log "统计信息:"
Log " 回调次数: " & stats.CalloutCount
Log " 回溯次数: " & stats.BacktrackCount
Log " 起始匹配次数: " & stats.StartMatchCount
Exit Sub
ErrorHandler:
Log "错误: " & Err.Description
End Sub
Private Sub cmdTestAutoCallout_Click()
On Error GoTo ErrorHandler
txtOutput.text = ""
m_nCalloutCount = 0
Log "========== 测试自动回调 =========="
' 设置模式和自动回调
m_re.Pattern = "a+b"
m_re.EnableCallout = True
m_re.AutoCallout = True
Log "模式: " & m_re.Pattern
Log "自动回调: 已启用"
Log "开始匹配..."
' 执行匹配
Dim matches As Object
Set matches = m_re.Execute("aaab")
Log "匹配完成!"
Log "匹配数量: " & matches.Count
If matches.Count > 0 Then
Log "匹配值: " & matches.item(0).Value
End If
Log "总回调次数: " & m_nCalloutCount
' 获取统计信息
Dim stats As Object
Set stats = m_re.CalloutStats
Log "统计信息: " & stats.ToString
Exit Sub
ErrorHandler:
Log "错误: " & Err.Description
End Sub
' OnCallout 事件处理程序
Private Sub m_re_OnCallout(ByVal CalloutInfo As loquatRegExp.ICalloutInfo, Cancel As Boolean, ReturnValue As Long)
m_nCalloutCount = m_nCalloutCount + 1
' 记录回调信息
Log "--- 回调 #" & m_nCalloutCount & " ---"
Log " 回调编号: " & CalloutInfo.CalloutNumber
Dim calloutStr As String
calloutStr = CalloutInfo.CalloutString
If Len(calloutStr) > 0 Then
Log " 回调字符串: " & calloutStr
End If
Log " 当前位置: " & CalloutInfo.CurrentPosition
Log " 起始匹配: " & CalloutInfo.StartMatch
Log " 模式位置: " & CalloutInfo.PatternPosition
Log " 是否回溯: " & CalloutInfo.IsBacktrack
Log " 是否起始: " & CalloutInfo.IsStartMatch
' 可以通过设置 Cancel 或 ReturnValue 来控制匹配行为
' Cancel = True ' 取消匹配
' ReturnValue = 1 ' 返回非零值
End Sub
Private Sub Log(ByVal msg As String)
txtOutput.text = txtOutput.text & msg & vbCrLf
txtOutput.SelStart = Len(txtOutput.text)
End SubCopyright © 2025- vba.vip All Rights Reserved.