如何使用正则表达式来匹配不连续的字符串

时间:2017-05-26 00:45:39

标签: regex vba email outlook outlook-vba

这个问题对其他人来说可能很简单,但我是RegEx和这个论坛的新手,并且无法在任何地方找到答案。

我有进入Microsoft Outlook的电子邮件,通常如下所示:

  

病人:SMITH,JANE

     

MRN:12345678

     

EncounterID:1234567890

     

EncounterDate:2017年4月11日12:00 AM

     

部门:神经病学

     

中心:头痛

     

地点:主校区

     

访问类型:NEW NEUR HEADACHE

     

参加物理:JONES,MARY

     

我希望Outlook检查每封电子邮件到达时,选择主题行表明他们有相关信息的邮件,然后提取MRN,患者姓氏,患者名字和遭遇日期。

当新邮件到达时,我的模块将运行以下Sub:

Public Sub ProcessImatchKpEmails(item As Outlook.MailItem)
Dim LastName As String
Dim FirstName As String
Dim EncounterDate As String
Dim MRN As String
Dim Body As String

On Error Resume Next

'   Check to make sure it is an Outlook mail message.
    If TypeName(item) <> "MailItem" Then Exit Sub
    Body = item.Body

'   Exract data from the email
    If item.Subject =  _
        gImatchKpEmailSubjectNo Or item.Subject = _ 
        gImatchKpEmailSubjectYes Or _
        item.Subject=_gImatchKpEmailSubjectMaybe Then
           MRN = ExtractText(Body, RegPattern("MRN"))
           LastName = ExtractText(Body, RegPattern("LastName"))
           FirstName = ExtractText(Body, RegPattern("FirstName"))
           EncounterDate = ExtractText(Body, RegPattern("EncounterDate"))
    End If
End Sub

RegPattern函数如下所示:

Public Function RegPattern(Lookup As String) As String 'Creates a 
  regPattern for each type of lookup

On Error Resume Next

    Select Case Lookup
        Case "LastName"
            RegPattern = "Patient\s*[:]+\s*(\w*)\s*"
        Case "FirstName"
            RegPattern = "Patient\s*[:]+\s*(\w*)[,](\w*)\s*"
        Case "EncounterDate"
            RegPattern = "EncounterDate\s*[:]+\s*(\w*)\s*" 
        Case "MRN"
            RegPattern = "MRN\s*[:]+\s*(\d*)\s*"
    End Select

    Debug.Print Lookup, RegPattern

End Function

ExtractText函数如下所示:

Public Function ExtractText(Str As String, RegPattern As String) As 
   String
Dim regEx As New RegExp
Dim numMatches As MatchCollection
Dim M As Match

On Error Resume Next

regEx.Pattern = RegPattern

Set numMatches = regEx.Execute(Str)
If numMatches.Count = 0 Then
    ExtractText = "missing"
Else
    Set M = numMatches(0)
    ExtractText = M.SubMatches(0)
End If

Debug.Print ExtractText
End Function

当我运行此代码时,代码会选择新电子邮件,并设法准确地提取MRN(12345678)和患者姓氏(史密斯)。

然而,它也将患者的名字拉为(史密斯)。同样地,它将遭遇日期拉为(4月),但其余部分则丢失。

有人可以告诉我什么是适当的RegEx代码来获取患者的名字,以及整个遭遇日期?

感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

"Patient\s*[:]+\s*(\w*)[,](\w*)\s*"

核心问题是你总是提取第0个子匹配;但你有两套捕捉括号。将第一组括号更改为非捕获括号应该有所帮助:

"Patient\s*[:]+\s*(?:\w*)[,](\w*)\s*"

或者甚至没有第一个名字的括号,因为没有理由为什么你需要在那里进行分组。

另请注意,[:]:相同,您可能希望至少捕获一个名称字符,即\w+而不是\w*