Regex 在VBA中使用带正向查找的正则表达式

Regex 在VBA中使用带正向查找的正则表达式,regex,vba,excel,Regex,Vba,Excel,这不是我完整编写的代码,有些是我从一两个站点拼凑而成的,有些是我设置的。我要做的是使用regex.Pattern中定义的正则表达式函数查看消息主题并提取值。以下是我将在电子邮件主题中看到的内容: 新Linux服务器:prod-servername-a001 到目前为止,我可以将完整的消息主题保存到Excel文件中,但是当我尝试实现regex部分时,我得到了一个错误代码5017(我可以找到的表达式中的错误),并且regex不“工作”。我的期望是脚本将提取消息主题,使用正则表达式提取值并将其放在单元

这不是我完整编写的代码,有些是我从一两个站点拼凑而成的,有些是我设置的。我要做的是使用regex.Pattern中定义的正则表达式函数查看消息主题并提取值。以下是我将在电子邮件主题中看到的内容:

新Linux服务器:prod-servername-a001

到目前为止,我可以将完整的消息主题保存到Excel文件中,但是当我尝试实现regex部分时,我得到了一个错误代码5017(我可以找到的表达式中的错误),并且regex不“工作”。我的期望是脚本将提取消息主题,使用正则表达式提取值并将其放在单元格中。我正在使用regexbuilder(RegEx测试程序)测试表达式,它在那里工作,但在这里不工作。我对VB很陌生,所以我不知道问题是VB不能使用这个表达式,还是脚本在其他地方失败了,错误是其他问题留下的。还是有更好的方法写这个

Sub ExportToExcel()
On Error GoTo ErrHandler

'Declarations
    Dim appExcel As Excel.Application
    Dim wkb As Excel.Workbook
    Dim wks As Excel.Worksheet
    Dim rng As Excel.Range
    Dim strSheet As String
    Dim filePath As String
    Dim strPath As String
    Dim intRowCounter As Integer
    Dim intColumnCounter As Integer
    Dim msg As Outlook.MailItem
    Dim nms As Outlook.NameSpace
    Dim fld As Outlook.MAPIFolder
    Dim itm As Object

'RegEx Declarations
    Dim result As String
    Dim allMatches As Object
    Dim regex As Object
    Set regex = CreateObject("vbscript.regexp")

    regex.Pattern = "(?<=Server: ).*"
    regex.Global = True
    regex.IgnoreCase = True


' Set the filename and path for output, requires creating the path to work
    strSheet = "outlook.xlsx"
    strPath = "D:\temp\"
    filePath = strPath & strSheet

'Debug
Debug.Print filePath

'Select export folder
    Set nms = Application.GetNamespace("MAPI")
    Set fld = nms.PickFolder

'Handle potential errors with Select Folder dialog box.
    If fld Is Nothing Then
        MsgBox "There are no mail messages to export", vbOKOnly, "Error"
        Exit Sub

    ElseIf fld.DefaultItemType <> olMailItem Then
        MsgBox "There are no mail messages to export", vbOKOnly, "Error"
        Exit Sub

    ElseIf fld.Items.Count = 0 Then
        MsgBox "There are no mail messages to export", vbOKOnly, "Error"
        Exit Sub
    End If

'Open and activate Excel workbook.
    Set appExcel = CreateObject("Excel.Application")
    appExcel.Workbooks.Open (filePath)
    Set wkb = appExcel.ActiveWorkbook
    Set wks = wkb.Sheets(1)
    wks.Activate
    appExcel.Application.Visible = True


'Copy field items in mail folder.
For Each itm In fld.Items
    intColumnCounter = 1
    Set msg = itm

    If itm.UnRead = True Then
        intRowCounter = intRowCounter + 1
        wks.Cells(1, 1).value = "Subject" 'Row 1 Column 1 (A)
        wks.Cells(1, 2).value = "Unread" 'Row 1 Column 2 (B)
        wks.Cells(1, 3).value = "Server" 'Row 1 Column 3 (C)

        Set rng = wks.Cells(intRowCounter + 1, intColumnCounter)

        If InStr(msg.Subject, "Server:") Then
        Set allMatches = regex.Execute(msg.Subject)
        rng.value = allMatches
        intColumnCounter = intColumnCounter + 1
        msg.UnRead = False                           

        Else
            rng.value = msg.Subject
            intColumnCounter = intColumnCounter + 1
            msg.UnRead = False
        End If

        Set rng = wks.Cells(intRowCounter + 1, intColumnCounter)
        rng.value = msg.UnRead
        intColumnCounter = intColumnCounter + 1
    End If

Next itm
Set appExcel = Nothing
Set wkb = Nothing
Set wks = Nothing
Set rng = Nothing
Set msg = Nothing
Set nms = Nothing
Set fld = Nothing
Set itm = Nothing
Exit Sub


ErrHandler:

If Err.Number = 1004 Then
    MsgBox filePath & " doesn't exist", vbOKOnly, "Error"

    ElseIf Err.Number = 13 Then
        MsgBox Err.Number & ": Type Mismatch", vbOKOnly, "Error"
    ElseIf Err.Number = 438 Then
        MsgBox Err.Number & ": Object doesn't support this property or method", vbOKOnly, "Error"
    ElseIf Err.Number = 5017 Then
        MsgBox Err.Number & ": Error in expression", vbOKOnly, "Error"
    Else
        MsgBox Err.Number & ": Description: ", vbOKOnly, "Error"

End If


Set appExcel = Nothing
Set wkb = Nothing
Set wks = Nothing
Set rng = Nothing
Set msg = Nothing
Set nms = Nothing
Set fld = Nothing
Set itm = Nothing

End Sub
子ExportToExcel()
关于错误转到错误处理程序
"宣言",
Dim appExcel作为Excel.Application
将wkb设置为Excel.工作簿
Dim以Excel格式工作。工作表
尺寸为Excel.Range
将标准表变暗为字符串
将文件路径设置为字符串
将strPath设置为字符串
作为整数的Dim intRowCounter
Dim intColumnCounter作为整数
将消息作为Outlook.mailtim
将nms设置为Outlook.NameSpace
将fld设置为Outlook.Mapi文件夹
将itm调暗为对象
'正则表达式声明
将结果变暗为字符串
将所有匹配项设置为对象
Dim正则表达式作为对象
设置regex=CreateObject(“vbscript.regexp”)

regex.Pattern=“(?VBA regex不支持lookbehinds,但在这种情况下,您不需要正面的lookbehind,您只需使用捕获组-“服务器:(*)”`,然后访问组1值:

Set regex = CreateObject("vbscript.regexp")
regex.Pattern = "Server: (.*)"
regex.IgnoreCase = True
Set allMatches = regex.Execute("New Linux Server: prod-servername-a001")
If allMatches.Count <> 0 Then
    rng.Value = allMatches(0).Submatches(0)
End If
Set regex=CreateObject(“vbscript.regexp”)
regex.Pattern=“服务器:(.*)”
regex.IgnoreCase=True
Set allMatches=regex.Execute(“新Linux服务器:prod-servername-a001”)
如果所有匹配。则计数0
rng.Value=所有匹配项(0)。子匹配项(0)
如果结束
这里,

  • 服务器:
    -匹配字符串
    服务器:
    +空格
  • (.*)
    -将零个或多个字符(新行除外)匹配并捕获到第1组中,直到行尾

查看有关的详细信息。

在VB.NET中,这没关系,而不是在VBA中。VBA不支持lookbehinds(and);捕获整个
(“新Linux服务器:.*)”
并在之后用字符串替换
新Linux服务器:
,什么都不做?谢谢你们!这肯定回答了我的问题。:)查找/替换的选项可能是一个很好的解决方案,只希望有一个vba的正则表达式也能做到这一点。另外,你能从末尾开始并以这种方式提取吗?我将寻找一个解决方案,看看这是否可行,但我对vb或正则表达式不太了解,所以我必须反复阅读,找出你们大多数人都知道的东西很抱歉,这花了这么长时间来验证,但这正是我需要的帮助。谢谢!