回调应用

当前位置:首页>正则>回调应用

回调应用

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 Sub