使用单词VBA正则表达式提取文本,然后以字符串

时间:2016-10-21 17:20:51

标签: regex string vba ms-word word-vba

我正在尝试在Word VBA中创建代码,该代码将自动保存(作为PDF)并根据文档的内容命名文档,该内容位于文本而非字段中。幸运的是格式化是标准化的,我已经知道如何保存它。我在其他地方测试了我的正则表达式,以确保它拉动我正在寻找的东西。麻烦的是我需要提取匹配的语句,将其转换为字符串,并将其保存到一个对象(所以我有东西要传递给它命名文档的代码)。

我需要匹配的文档部分如下,从“程序”开始到行尾,看起来像:

  

计划:计划名称(abr)

我为此制定的正则表达式是“Program:[^ \ n]”

我到目前为止的代码如下,但我不知道如何在活动文档中执行正则表达式,将输出转换为字符串并保存到对象:

Sub RegExProgram()

Dim regEx
Dim pattern As String

Set regEx = CreateObject("VBScript.RegExp")
regEx.IgnoreCase = True
regEx.Global = False
regEx.pattern = "Program\:[^\n]"

(missing code here)

End Sub

欢迎任何想法,如果这很简单,我很抱歉,我只是忽略了一些明显的事情。这是我的第一个VBA项目,我可以找到的大部分资源建议使用正则表达式替换,而不是将提取的文本保存为字符串。谢谢!

3 个答案:

答案 0 :(得分:3)

试试这个:

您可以找到RegExphere的文档。

Dim regEx as Object
Dim matchCollection As Object
Dim extractedString As String

Set regEx = CreateObject("VBScript.RegExp")
With regEx
  .IgnoreCase = True
  .Global = False    ' Only look for 1 match; False is actually the default.
  .Pattern = "Program: ([^\r]+)"  ' Word separates lines with CR (\r)
End With

' Pass the text of your document as the text to search through to regEx.Execute().
' For a quick test of this statement, pass "Program: Program Name (abr)"
set matchCollection = regEx.Execute(ActiveDocument.Content.Text)

' Extract the first submatch's (capture group's) value - 
' e.g., "Program Name (abr)" - and assign it to variable extractedString.
extractedString = matchCollection(0).SubMatches(0)
  • 我已经修改了你的正则表达式,假设你要在 Program:之后通过行尾捕获所有;您的原始正则表达式只会捕获Program:<space>

    • [^\r]+中附加(...)(所有字符到行尾)定义了一个所谓的子表达式(也就是捕获组),它允许选择性地提取只有整个模式捕获的感兴趣的子字符串。
  • 传递要搜索的字符串的.Execute()方法始终返回匹配的集合Match个对象)。
    由于代码中.Global属性设置为False,因此在这种情况下,输出集合(最多) 1 条目(索引0)。

  • 如果正则表达式有子表达式(在我们的例子中是1),那么匹配集合的每个条目都有一个非空.SubMatches集合,每个子表达式都有一个条目,但请注意,.SubMatches条目是字符串,而不是Match个对象。

  • Match objects包含属性.FirstIndex.LengthValue(已捕获的字符串)。由于.Value属性是默认属性,因此只需访问对象本身即可,而无需引用.Value属性(例如,而不是更详细的{{} 1}}要访问捕获的字符串(完整),您可以使用快捷方式matchCollection(0).Value(相反,matchCollection(0)条目只是字符串。)

答案 1 :(得分:1)

如果您只是寻找一个以&#34开头的字符串;程序:&#34;并且想要从那里走到最后,你不需要正则表达式:

Public Sub ReadDocument()

Dim aLine As Paragraph
Dim aLineText As String

Dim start As Long

For Each aLine In ActiveDocument.Paragraphs

    aLineText = aLine.Range.Text
    start = InStr(aLineText, "Program:")

    If start > 0 Then
        my_str = Mid(aLineText, start)
    End If

Next aLine

End Sub

这将逐行读取文档,并将您的匹配存储在变量&#34; my_str&#34;当遇到匹配的行时。

答案 2 :(得分:1)

拉齐尔版:

a = Split(ActiveDocument.Range.Text, "Program:")
If UBound(a) > 0 Then 
    extractedString = Trim(Split(a(1), vbCr)(0))
End If

如果我没记错的话,Word中的段落以vbCr结尾(\r而非\n