Regex 使用正则表达式提取URL

Regex 使用正则表达式提取URL,regex,vba,excel,outlook,Regex,Vba,Excel,Outlook,我从同一个网站收到10或12封电子邮件,我想使用regex提取一个特定的URL(如果可能的话),并将其粘贴到正确的Excel文件中。电子邮件在Outlook中,我已经有一个VBA脚本(从Outlook VBA运行),用于提取主题和发件人。然而,我确实需要每个电子邮件中的特定URL作为提取的第三条信息 我已尝试创建一系列步骤来: 创建正则表达式 将正则表达式应用于当前电子邮件 将提取的URL放入excel文档中 然而,我所创造的一切都失败得很惨。粘贴在下面的VBA始终有效,直到我在附加的正则表达式

我从同一个网站收到10或12封电子邮件,我想使用regex提取一个特定的URL(如果可能的话),并将其粘贴到正确的Excel文件中。电子邮件在Outlook中,我已经有一个VBA脚本(从Outlook VBA运行),用于提取主题和发件人。然而,我确实需要每个电子邮件中的特定URL作为提取的第三条信息

我已尝试创建一系列步骤来:

  • 创建正则表达式
  • 将正则表达式应用于当前电子邮件
  • 将提取的URL放入excel文档中
  • 然而,我所创造的一切都失败得很惨。粘贴在下面的VBA始终有效,直到我在附加的正则表达式部分中写入

    我相信我有正确的模式:

    /http:\/\/www.changedetection.com\/log(.*)/ig
    
    每当我运行新的VBA脚本时,它都不会做任何事情。旧代码总是有效的。代码写入此Outlook会话(只是为了澄清),因为mailitem需要从脚本运行

    Const xlUp As Long = -4162
    Sub ExportToExcel(MyMail As MailItem)
    
        Dim strID As String, olNS As Outlook.NameSpace
        Dim olMail As Outlook.MailItem
        Dim strFileName As String
        Dim strBody As String
        Dim Reg1 As RegExp
        Dim M1 As MatchCollection
        Dim M As Match
    
        Set Reg1 = New RegExp
        With Reg1
            .Pattern = "http://www\.changedetection\.com/log(.*)"
            .IgnoreCase = True
            .Global = True
         End With
    
        If Reg1.test(olMail.Body) Then
    
            Set M1 = Reg1.Execute(olMail.Body)
            For Each M In M1
            strBody = M.SubMatches(1)
            Next
        End If
    
        '~~> Excel Variables
        Dim oXLApp As Object, oXLwb As Object, oXLws As Object
        Dim lRow As Long
    
        strID = MyMail.EntryID
        Set olNS = Application.GetNamespace("MAPI")
        Set olMail = olNS.GetItemFromID(strID)
    
    
    
        '~~> Establish an EXCEL application object
        On Error Resume Next
        Set oXLApp = GetObject(, "Excel.Application")
    
        '~~> If not found then create new instance
        If Err.Number <> 0 Then
            Set oXLApp = CreateObject("Excel.Application")
        End If
        Err.Clear
        On Error GoTo 0
    
        '~~> Show Excel
        oXLApp.Visible = True
    
        '~~> Open the relevant file
        Set oXLwb = oXLApp.Workbooks.Open("M:\Monitor\Monitor_Test_1.xlsx")
    
        '~~> Set the relevant output sheet. Change as applicable
        Set oXLws = oXLwb.Sheets("Test")
    
        lRow = oXLws.Range("A" & oXLApp.Rows.Count).End(xlUp).Row + 1
    
        '~~> Write to outlook
        With oXLws
            '
            '~~> Code here to output data from email to Excel File
            '~~> For example
            '
            .Range("A" & lRow).Value = olMail.Subject
            .Range("B" & lRow).Value = olMail.SenderName
            .Range("C" & lRow).Value = strBody
    
            '
        End With
    
        '~~> Close and Clean up Excel
        oXLwb.Close (True)
        oXLApp.Quit
    
        Set Reg1 = Nothing
        Set oXLws = Nothing
        Set oXLwb = Nothing
        Set oXLApp = Nothing
    
        Set olMail = Nothing
        Set olNS = Nothing
    End Sub
    
    Const xlUp As Long=-4162
    子ExportToExcel(我的邮件作为邮件项)
    Dim strID作为字符串,olNS作为Outlook.NameSpace
    以Outlook.MailItem的形式发送邮件
    将strFileName设置为字符串
    像弦一样暗的链子
    Dim Reg1作为RegExp
    将M1设置为匹配集合
    把我当作对手
    Set Reg1=New RegExp
    使用Reg1
    .Pattern=”http://www\.changedetection\.com/log(.*)”
    .IgnoreCase=True
    .Global=True
    以
    如果是Reg1.test(olMail.Body),那么
    Set M1=Reg1.Execute(olMail.Body)
    M1中每M
    strBody=M.子匹配(1)
    下一个
    如果结束
    '~~>Excel变量
    Dim oXLApp作为对象,oXLwb作为对象,oXLws作为对象
    暗淡的光线和长的一样
    strID=MyMail.EntryID
    Set olNS=Application.GetNamespace(“MAPI”)
    设置olMail=olNS.GetItemFromID(strID)
    “~~>建立EXCEL应用程序对象
    出错时继续下一步
    设置oXLApp=GetObject(,“Excel.Application”)
    “~~>如果找不到,则创建新实例
    如果错误号为0,则
    设置oXLApp=CreateObject(“Excel.Application”)
    如果结束
    呃,明白了
    错误转到0
    “~~>显示Excel
    oXLApp.Visible=True
    “~~>打开相关文件
    设置oXLwb=oXLApp.Workbooks.Open(“M:\Monitor\Monitor\u Test\u 1.xlsx”)
    “~~>设置相关的输出表。更改(如适用)
    设置oXLws=oXLwb.表(“测试”)
    lRow=oXLws.Range(“A”&oXLApp.Rows.Count)。End(xlUp)。Row+1
    “~~>写入outlook
    使用oXLws
    '
    “~~>此处的代码用于将数据从电子邮件输出到Excel文件
    例如‘~~>
    '
    .Range(“A”&lRow).Value=olMail.Subject
    .Range(“B”&lRow).Value=olMail.SenderName
    .Range(“C”和lRow).Value=strBody
    '
    以
    “~~>关闭并清理Excel
    oXLwb.Close(真)
    奥克斯拉普,退出
    Set Reg1=无
    设置oXLws=Nothing
    设置oXLwb=Nothing
    设置oXLApp=Nothing
    设置olMail=Nothing
    设置olNS=Nothing
    端接头
    
    VBScript正则表达式模式不使用
    /
    指示开始和结束。它们也不在后面的
    /
    后面使用
    i
    g
    来表示不区分大小写或全局性。相反,请使用
    IgnoreCase
    Global
    属性

    例如:

    With Reg1
        .Pattern = "http://www\.changedetection\.com/log(.*)"
        .IgnoreCase = True
        .Global = True
    End With
    

    如果您正在查找有关
    RegExp
    对象的更多信息。

    谢谢您的帮助。我在脚本中插入了更正。它仍然不起作用。我运行脚本,什么都没有。我一定是把别的事情搞砸了。我会看你寄给我的推荐信。如果您有任何其他建议,我想听听。它不是扩展到您的
    If Reg1.test(olMail.Body)那么
    语句吗?是的。我相信你是对的。它根本不是分支。请尝试上面的正则表达式。你不需要逃避前斜杠,但你需要逃避圆点。