【问题标题】:RegEx to extract a word from mail's body正则表达式从邮件正文中提取一个单词
【发布时间】:2017-11-27 03:23:13
【问题描述】:

我需要从收到的邮件正文中提取一个单词。

我在引用网站后使用了正则表达式,但它没有给出任何结果,也没有抛出错误。

示例:描述:示例文本

我只想要冒号后面的第一个单词。

Dim reg1 As RegExp
Dim M1 As MatchCollection
Dim M As Match
Dim EAI As String

Set reg1 = New RegExp

With reg1
    .Pattern = "Description\s*[:]+\s*(\w*)\s*"
    .Global = False
End With

If reg1.Test(Item.Body) Then
    Set M1 = reg1.Execute(Item.Body)
    For Each M In M1            
        EAI = M.SubMatches(1)    
    Next        
End If

【问题讨论】:

  • 您确定没有弹出错误吗?试试M.SubMatches(0),看看你的Sub中是否没有On Error Resume Next

标签: regex vba outlook


【解决方案1】:

请注意,您的模式效果很好,但最好写成:

Description\s*:+\s*(\w+)

它会匹配Description,然后是 0+ 个空格,1+ 个: 符号,再是 0 个或多个空格,然后将捕获到第 1 组中的一个或多个单词字符(作为字母, 数字或_ 符号)。

现在,捕获组 1 的值存储在 M.SubMatches(0) 中。此外,您不需要运行.Test(),因为如果没有匹配项,您不需要遍历它们。你实际上想得到一个匹配。

因此,只需使用

Set M1 = reg1.Execute(Item.body)
If M1.Count > 0 Then
   EAI = M1(0).SubMatches(0)
End If

其中M1(0) 是第一个匹配项,.SubMatches(0) 是第一组中的文本。

【讨论】:

  • 感谢 Wiktor 的帮助,但在我的情况下,如果我在冒号后有多个单词,我不仅需要子匹配 (0),我还需要其他单词。
  • 描述:abc def **现在它只返回 abc 我想要 def 也在字符串变量中。
  • 然后将\w+ 替换为.+\w+ 匹配 1 个或多个字母、数字和 _.+ 将匹配 任何 1 个或多个除换行符以外的字符。
  • 当我将 "Email Address\s*:+\s*(\w+)" 替换为 "Email Address\s*:+\s*(\.+)" 时,它没有返回任何内容.如您所见,我想获取电子邮件地址,但它只获取名字。在 abc@xyz.com 它只返回 abc。我不能得到完整的邮件地址吗?
  • 感谢 Wiktor 对我的方案有帮助。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2019-12-31
相关资源
最近更新 更多