如何在电子邮件中找到国家/地区缩写

How can I find country abbreviations in emails

我有这个正则表达式,可以在电子邮件中找到国家/地区缩写,但它不起作用,因为,

我的表达方式有误,但我认为情况并非如此,因为 regex101 表明它工作得很好,或者
我在 vba 脚本中实施错误。

                   Dim Countries As String
                    Countries = "(Nordic|F|USA|Norway|SK|Singapur|RU|China|Pakistan|Korea|Indien|India|Italien|UK|France|Deutschland|D|CZ|BLR|Schweden|Sweden|I|Tver|Minsk|HU|Russland|Frankreich|" & _
                                "AFG|ALA|ALB|DZA|ASM|AND|AGO|AIA|ATA|ATG|ARG|ARM|ABW|AUS|AUT|AZE|BHS|BHR|BGD|BRB|BLR|BEL|BLZ|BEN|BMU|BTN|BOL|BES|BIH|BWA|BVT|BRA|IOT|BRN|BGR|BFA|BDI|CPV|KHM|CMR|CAN|CPV|CYM|CAF|TCD|CHL|CHN|TWN|CXR|CCK|COL|COM|COD|COG|COK|CRI|CIV|HRV|CUB|CUW|CYP|CZE|KOR|COG|DNK|DJI|DMA|DOM|ECU|EGY|SLV|GNQ|ERI|EST|SWZ|ETH|FLK|FRO|FJI|FIN|FRA|GUF|PYF|ATF|GAB|GMB|GEO|DEU|GHA|GIB|GBR|GRC|GRL|GRD|GLP|GUM|GTM|GGY|GIN|GNB|GUY|HTI|HMD|VAT|HND|HKG|HUN|ISL|IND|IDN|IRN|IRQ|IRL|IMN|ISR|ITA|JAM|SJM|JPN|JEY|JOR|KAZ|KEN|KIR|PRK|KOR|KWT|KGZ|LAO|LVA|LBN|LSO|LBR|LBY|LIE|LTU|LUX|MAC|MKD|MDG|MWI|MYS|MDV|MLI|MLT|MHL|MTQ|MRT|MUS|MYT|MEX|FSM|MDA|MCO|MNG|MNE|MSR|MAR|MOZ|MMR|NAM|NRU|NPL|NLD|NCL|NZL|NIC|NER|NGA|NIU|NFK|MNP|NOR|OMN|PAK|PLW|PSE|PAN|PNG|PRY|PRC|PER|PHL|PCN|POL|PRT|PRI|QAT|TWN|KOR|COG|REU|ROU|RUS|RWA|ESH|BLM|SHN|KNA|LCA|MAF|SPM|VCT|WSM|SMR|STP|SAU|SEN|SRB|SYC|SLE|SGP|" & _
                                "SXM|SVK|SVN|SLB|SOM|ZAF|SGS|KOR|SSD|ESP|LKA|SDN|SUR|SJM|SWE|CHE|SYR|TWN|TJK|TZA|THA|TLS|TGO|TKL|TON|TTO|TUN|TUR|TKM|TCA|TUV|UGA|UKR|ARE|GBR|UMI|USA|VIR|URY|UZB|VUT|VEN|VNM|VGB|VIR|WLF|ESH|YEM|ZMB|ZWE\S)"
                    With Reg1
                        .Pattern = "2_a Von Firma[:].*" & """ & Countries & """ & "$"
                        'Formating in email inconsistent
                        .Global = False
                    End With
                    On Error GoTo CaseThree
                    If Reg1.Test(olMail.Body) Then
                        Set M1 = Reg1.Execute(olMail.Body)
                    End If
                    For Each M In M1
                        Debug.Print M.SubMatches(0)
                        With xExcelApp
                            Range("B6").Value = M.SubMatches(0)
                        End With
                    Next M
CaseThree:

它总是给我最后的正则表达式结果,我怀疑这是因为它找不到我的 if Reg1.Test(olMail.Body) Then 语句中的错误

您需要在 VBA 代码中使用 m 标志等价物,.Multiline=Trueg 标志等价物 .Global=True.Execute 的代码匹配得很好,因为您遍历了所有找到的匹配项。

但是,您的正则表达式也可能需要一些增强,我建议使用惰性点模式并在国家/地区模式之前添加单词边界。

您也不需要 .Pattern 定义中的三重引号。

这是一个修复示例:

Countries = "\b(Nordic|F|USA|Norway|SK|Singapur|RU|China|Pakistan|Korea|Indien|India|Italien|UK|France|Deutschland|D|CZ|BLR|Schweden|Sweden|I|Tver|Minsk|HU|Russland|Frankreich|" & _
    "AFG|ALA|ALB|DZA|ASM|AND|AGO|AIA|ATA|ATG|ARG|ARM|ABW|AUS|AUT|AZE|BHS|BHR|BGD|BRB|BLR|BEL|BLZ|BEN|BMU|BTN|BOL|BES|BIH|BWA|BVT|BRA|IOT|BRN|BGR|BFA|BDI|CPV|KHM|CMR|CAN|CPV|CYM|CAF|TCD|CHL|CHN|TWN|CXR|CCK|COL|COM|COD|COG|COK|CRI|CIV|HRV|CUB|CUW|CYP|CZE|KOR|COG|DNK|DJI|DMA|DOM|ECU|EGY|SLV|GNQ|ERI|EST|SWZ|ETH|FLK|FRO|FJI|FIN|FRA|GUF|PYF|ATF|GAB|GMB|GEO|DEU|GHA|GIB|GBR|GRC|GRL|GRD|GLP|GUM|GTM|GGY|GIN|GNB|GUY|HTI|HMD|VAT|HND|HKG|HUN|ISL|IND|IDN|IRN|IRQ|IRL|IMN|ISR|ITA|JAM|SJM|JPN|JEY|JOR|KAZ|KEN|KIR|PRK|KOR|KWT|KGZ|LAO|LVA|LBN|LSO|LBR|LBY|LIE|LTU|LUX|MAC|MKD|MDG|MWI|MYS|MDV|MLI|MLT|MHL|MTQ|MRT|MUS|MYT|MEX|FSM|MDA|MCO|MNG|MNE|MSR|MAR|MOZ|MMR|NAM|NRU|NPL|NLD|NCL|NZL|NIC|NER|NGA|NIU|NFK|MNP|NOR|OMN|PAK|PLW|PSE|PAN|PNG|PRY|PRC|PER|PHL|PCN|POL|PRT|PRI|QAT|TWN|KOR|COG|REU|ROU|RUS|RWA|ESH|BLM|SHN|KNA|LCA|MAF|SPM|VCT|WSM|SMR|STP|SAU|SEN|SRB|SYC|SLE|SGP|" & _
    "SXM|SVK|SVN|SLB|SOM|ZAF|SGS|KOR|SSD|ESP|LKA|SDN|SUR|SJM|SWE|CHE|SYR|TWN|TJK|TZA|THA|TLS|TGO|TKL|TON|TTO|TUN|TUR|TKM|TCA|TUV|UGA|UKR|ARE|GBR|UMI|USA|VIR|URY|UZB|VUT|VEN|VNM|VGB|VIR|WLF|ESH|YEM|ZMB|ZWE\S)"
With Reg1
    .Pattern = "2_a Von Firma:.*?" & Countries & "$"
    'Formating in email inconsistent
    .Global = True
    .Multiline = True
End With

基于@Wiktor Stribiżew 的解决方案:

                    Dim Countries As String
                        Countries = "2_a Von Firma:(?:(?!\b(?:Nordic|F|USA|Norway|SK|Singapur|RU|China|Pakistan|Korea|Indien|India|Italien|UK|France|Deutschland|D|CZ|BLR|Schweden|Sweden|I|Tver|Minsk|HU|Russland|Frankreich|" & _
"AFG|ALA|ALB|DZA|ASM|AND|AGO|AIA|ATA|ATG|ARG|ARM|ABW|AUS|AUT|AZE|BHS|BHR|BGD|BRB|BLR|BEL|BLZ|BEN|BMU|BTN|BOL|BES|BIH|BWA|BVT|BRA|IOT|BRN|BGR|BFA|BDI|CPV|KHM|CMR|CAN|CPV|CYM|CAF|TCD|CHL|CHN|TWN|CXR|CCK|COL|COM|COD|COG|COK|CRI|CIV|HRV|CUB|CUW|CYP|CZE|KOR|COG|DNK|DJI|DMA|DOM|ECU|EGY|SLV|GNQ|ERI|EST|SWZ|ETH|FLK|FRO|FJI|FIN|FRA|GUF|PYF|ATF|GAB|GMB|GEO|DEU|GHA|GIB|GBR|GRC|GRL|GRD|GLP|GUM|GTM|GGY|GIN|GNB|GUY|HTI|HMD|VAT|HND|HKG|HUN|ISL|IND|IDN|IRN|IRQ|IRL|IMN|ISR|ITA|JAM|SJM|JPN|JEY|JOR|KAZ|KEN|KIR|PRK|KOR|KWT|KGZ|LAO|LVA|LBN|LSO|LBR|LBY|LIE|LTU|LUX|MAC|MKD|MDG|MWI|MYS|MDV|MLI|MLT|MHL|MTQ|MRT|MUS|MYT|MEX|FSM|MDA|MCO|MNG|MNE|MSR|MAR|MOZ|MMR|NAM|NRU|NPL|NLD|NCL|NZL|NIC|NER|NGA|NIU|NFK|MNP|NOR|OMN|PAK|PLW|PSE|PAN|PNG|PRY|PRC|PER|PHL|PCN|POL|PRT|PRI|QAT|TWN|KOR|COG|REU|ROU|RUS|RWA|ESH|BLM|SHN|KNA|LCA|MAF|SPM|VCT|WSM|SMR|STP|SAU|SEN|SRB|SYC" & _
"|SLE|SGP|SXM|SVK|SVN|SLB|SOM|ZAF|SGS|KOR|SSD|ESP|LKA|SDN|SUR|SJM|SWE|CHE|SYR|TWN|TJK|TZA|THA|TLS|TGO|TKL|TON|TTO|TUN|TUR|TKM|TCA|TUV|UGA|UKR|ARE|GBR|UMI|USA|VIR|URY|UZB|VUT|VEN|VNM|VGB|VIR|WLF|ESH|YEM|ZMB|ZWE)).)*\b(Nordic|F|USA|Norway|SK|Singapur|RU|China|Pakistan|Korea|Indien|India|Italien|UK|France|Deutschland|D|CZ|BLR|Schweden|Sweden|I|Tver|Minsk|HU|Russland|Frankreich|AFG|ALA|ALB|DZA|ASM|AND|AGO|AIA|ATA|ATG|ARG|ARM|ABW|AUS|AUT|AZE|BHS|BHR|BGD|BRB|BLR|BEL|BLZ|BEN|BMU|BTN|BOL|BES|BIH|BWA|BVT|BRA|IOT|BRN|BGR|BFA|BDI|CPV|KHM|CMR|CAN|CPV|CYM|CAF|TCD|CHL|CHN|TWN|CXR|CCK|COL|COM|COD|COG|COK|CRI|CIV|HRV|CUB|CUW|CYP|CZE|KOR|COG|DNK|DJI|DMA|DOM|ECU|EGY|SLV|GNQ|ERI|EST|SWZ|ETH|FLK|FRO|FJI|FIN|FRA|GUF|PYF|ATF|GAB|GMB|GEO|DEU|GHA|GIB|GBR|GRC|GRL|GRD|GLP|GUM|GTM|GGY|GIN|GNB|GUY|HTI|HMD|VAT|HND|HKG|HUN|ISL|IND|IDN|IRN|IRQ|IRL|IMN|ISR|ITA" & _
"|JAM|SJM|JPN|JEY|JOR|KAZ|KEN|KIR|PRK|KOR|KWT|KGZ|LAO|LVA|LBN|LSO|LBR|LBY|LIE|LTU|LUX|MAC|MKD|MDG|MWI|MYS|MDV|MLI|MLT|MHL|MTQ|MRT|MUS|MYT|MEX|FSM|MDA|MCO|MNG|MNE|MSR|MAR|MOZ|MMR|NAM|NRU|NPL|NLD|NCL|NZL|NIC|NER|NGA|NIU|NFK|MNP|NOR|OMN|PAK|PLW|PSE|PAN|PNG|PRY|PRC|PER|PHL|PCN|POL|PRT|PRI|QAT|TWN|KOR|COG|REU|ROU|RUS|RWA|ESH|BLM|SHN|KNA|LCA|MAF|SPM|VCT|WSM|SMR|STP|SAU|SEN|SRB|SYC|SLE|SGP|SXM|SVK|SVN|SLB|SOM|ZAF|SGS|KOR|SSD|ESP|LKA|SDN|SUR|SJM|SWE|CHE|SYR|TWN|TJK|TZA|THA|TLS|TGO|TKL|TON|TTO|TUN|TUR|TKM|TCA|TUV|UGA|UKR|ARE|GBR|UMI|USA|VIR|URY|UZB|VUT|VEN|VNM|VGB|VIR|WLF|ESH|YEM|ZMB|ZWE)?$"
                    With Reg1
                        .Pattern = Countries
                        'Formating in email inconsistent
                        .Global = False
                        .MultiLine = True
                    End With
                    If Reg1.Test(olMail.Body) Then
                        Set M1 = Reg1.Execute(olMail.Body)
                    End If
                    For Each M In M1
                        Debug.Print M.SubMatches(0)
                        With xExcelApp
                            Range("B6").Value = M.SubMatches(0)
                        End With
                    Next M

将整个 regex 放入 Countries
.Global = False,.Multiline = True

如果该行不包含国家/地区 M.Submatches(0) 将 return Empty 因此该单元格将不包含任何值。