我正在尝试在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项目,我可以找到的大部分资源建议使用正则表达式替换,而不是将提取的文本保存为字符串。谢谢!
答案 0 :(得分:3)
试试这个:
您可以找到RegExp
班here的文档。
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
,.Length
和Value
(已捕获的字符串)。由于.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
)