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

Regex 使用正则表达式在VBA Excel中查找段落,regex,vba,excel,Regex,Vba,Excel,我试图使用正则表达式“提取”文档中的段落。每段前面和后面分别有一行“-”,每段以数字开头 比如说 - 1.这是一段 它可以跨越多行 - 理想情况下,我不想包含“-”,但这并不重要,因为我将把它放在一个字符串中,并对它运行另一个正则表达式(我知道它是有效的) 我尝试使用的代码基本上如下 Dim matchPara as Object Dim regex as Object Dim theMatch as Object Dim matches as Object Dim fileName as St

我试图使用正则表达式“提取”文档中的段落。每段前面和后面分别有一行“-”,每段以数字开头

比如说

-
1.这是一段
它可以跨越多行
-

理想情况下,我不想包含“-”,但这并不重要,因为我将把它放在一个字符串中,并对它运行另一个正则表达式(我知道它是有效的)

我尝试使用的代码基本上如下

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
我已经测试了这个正则表达式,它似乎做了我想要的。我也在没有分组的情况下测试了它

-?\d.*-

但是,当我运行代码时,
match.Value
只包含一个“-”。在对正则表达式进行了一些修改之后,我让它显示第一行文本,但不会超过第一行

我已使用以下选项检查匹配值的长度:

然后将match.Value的内容放在工作表的一个单元格中,查看它是否在消息框中被截断,但这两种理论都被证明是错误的

我现在完全不知所措,我开始怀疑这可能是VBA的事情,而不是正则表达式的事情。没有使用正则表达式的要求,我只是认为这是最容易做到的

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

以下是一个屏幕截图:

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


如果您需要破折号
-
,则只需将它们包含在捕获组(外括号)中即可。

此正则表达式与您的描述匹配,并成功地提取段落(在regex101.com上测试):

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


由于附加的好处,前导和尾随空格被截断(“\s*”在组外)。

这种简单的方法不使用正则表达式。它假设数据在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

我认为它在regex101上工作不正常。你能发布一个regex101的结果截图,显示它正在返回你的完整段落吗?还有,有没有理由需要用正则表达式来实现这一点?另外,您实际对输出做了什么?(我假设目标不仅仅是在
MsgBox
中显示它们?添加了屏幕截图和问题答案屏幕截图中的正则表达式与代码中的正则表达式不同。不,但它与我给出的第二个示例相同,也不起作用检查此答案:
matchPara = "-\n\d+\.\s*((?:.|\n)+?)\s*\n-"
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