[英]How to use Regex to match discontinuous strings
這個問題對其他人來說可能很簡單,但我是RegEx
和這個論壇的新手,並且無法在任何地方找到答案。
我有進入 Microsoft Outlook 的電子郵件通常如下所示:
患者:史密斯,簡
MRN:12345678
遭遇號:1234567890
邂逅日期:2017 年 4 月 11 日 12:00AM
科室:神經內科
中心:頭痛
地點:主校區
就診類型:新神經頭痛
主治醫師: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) 和患者姓氏 (Smith)。
但是,它也將患者的名字拉為 (Smith)。 同樣,它將遇到日期拉為 (Apr),但丟失了其余部分。
任何人都可以告訴我獲取患者的名字以及整個遭遇日期的適當RegEx
代碼是什么?
感謝您的幫助。
"Patient\\s*[:]+\\s*(\\w*)[,](\\w*)\\s*"
核心問題是你總是提取第0個子匹配; 但是您有兩組捕獲括號。 將第一組括號更改為非捕獲括號應該會有所幫助:
"Patient\s*[:]+\s*(?:\w*)[,](\w*)\s*"
甚至名字沒有括號,因為沒有理由需要在那里分組。
另請注意, [:]
與:
相同,並且您可能希望為名稱捕獲至少一個字符,即\\w+
而不是\\w*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.