簡體   English   中英

如何使用正則表達式匹配不連續的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM