这个问题对其他人来说可能很简单,但我是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
代码来获取患者的名字,以及整个遭遇日期?
感谢您的帮助。
答案 0 :(得分:-1)
"Patient\s*[:]+\s*(\w*)[,](\w*)\s*"
核心问题是你总是提取第0个子匹配;但你有两套捕捉括号。将第一组括号更改为非捕获括号应该有所帮助:
"Patient\s*[:]+\s*(?:\w*)[,](\w*)\s*"
或者甚至没有第一个名字的括号,因为没有理由为什么你需要在那里进行分组。
另请注意,[:]
与:
相同,您可能希望至少捕获一个名称字符,即\w+
而不是\w*
。