使用正则表达式在VBA Excel中查找段落

问题描述 投票:0回答:3

我正在尝试使用正则表达式来“提取”文档中的段落。每个段落在单独的行之前和之后都有一个“ - ”,每个段落都以数字开头。

例如

- 这是一个段落 它可能会超过多行 -

理想情况下,我不想包含' - ',但它并不重要,因为我将它放在一个字符串中并运行另一个正则表达式(我知道一个工作)

我试图使用的代码基本如下

Dim matchPara as Object
Dim regex as Object
Dim theMatch as Object
Dim matches as Object
Dim fileName as String
Dim fileNo as Integer
Dim document as String

matchPara = "-?(\d.*?)?-"
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = matchPara
regex.Global = True
regex.Multiline = True

fileName = "C:\file.txt"
fileNo = FreeFile

Open fileName For Input As #fileNo
document = Input$(LOF(fileNo), fileNo)
set matches = regex.Execute(document)

For Each theMatch in matches
    MsgBox(theMatch.Value)
Next theMatch

Close #fileNo

我已经在regex101上测试了这个正则表达式,它似乎做了我想要的。我也没有分组测试它

- ?\ d *? -

然而,当我运行代码时,theMatch.Value只包含一个' - '。在使用正则表达式搞乱后,我得到它来显示第一行文本,但从来没有超过第一行。

我已经检查了theMatch.Value的长度:

MsgBox(len(theMatch.Value))

并将theMatch.Value的内容放在工作表的单元格中,以查看它是否在消息框中被切断,但两种理论都被证明是错误的。

我现在完全失去了,我开始怀疑它可能是VBA的东西而不是正则表达式的东西。没有要求使用正则表达式,我只是假设它是最简单的事情。

这些段落包含我试图提取的数据。因此,我们的想法是将每个段落的正则表达式放在一个字符串中然后运行其他正则表达式来获取我需要的信息。有些段落不会包含我需要的数据,因此想法是遍历每个单独的段落,然后如果我需要的数据不在该段落中则错误处理更好(即得到我能做的,并用错误消息删除其余部分)

这是一个截图:

regex excel vba excel-vba
3个回答
1
投票

这种简单的方法不使用Regex。它假设数据在A列中,段落放在B列中:

Sub paragraph_no_regex()
    Dim s As String
    Dim ary

    With Application.WorksheetFunction
        s = .TextJoin(" ", False, Columns(1).SpecialCells(2))
    End With

    ary = Split(s, "-")
    i = 1
    For Each a In ary
        Cells(i, 2) = a
        i = i + 1
    Next a
End Sub

enter image description here


0
投票
Sub F()

    Dim re As New RegExp
    Dim sMatch As String
    Dim document As String

    re.Pattern = "-\n((.|\n)+?)\n-"

    'Getting document
    document = ...

    sMatch = re.Execute(document)(0).SubMatches(0)

End Sub

如果你需要破折号-,那么只需将它们包含在捕获组(外括号)中。


0
投票

此RegEx符合您的描述并成功提取段落(在regex101.com上测试):

matchPara = "-\n\d+\.\s*((?:.|\n)+?)\s*\n-"

它需要'全局'标志,但不需要'多线'标志。相反,行尾标记在正则表达式中匹配。重点是最里面的匹配组将匹配任何字符,包括行尾(作为替代),但是以非贪婪的方式(“+?”)这样做。它不关心字边界,因为这不是必需的。另外,“ - ”不是正则表达式中使用的特殊字符,因此不必转义。

由于额外的好处导致和尾随空格被切断(组外的“\ s *”)。

© www.soinside.com 2019 - 2024. All rights reserved.