我正在尝试使用正则表达式来“提取”文档中的段落。每个段落在单独的行之前和之后都有一个“ - ”,每个段落都以数字开头。
例如
- 这是一个段落 它可能会超过多行 -
理想情况下,我不想包含' - ',但它并不重要,因为我将它放在一个字符串中并运行另一个正则表达式(我知道一个工作)
我试图使用的代码基本如下
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的东西而不是正则表达式的东西。没有要求使用正则表达式,我只是假设它是最简单的事情。
这些段落包含我试图提取的数据。因此,我们的想法是将每个段落的正则表达式放在一个字符串中然后运行其他正则表达式来获取我需要的信息。有些段落不会包含我需要的数据,因此想法是遍历每个单独的段落,然后如果我需要的数据不在该段落中则错误处理更好(即得到我能做的,并用错误消息删除其余部分)
这是一个截图:
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
如果你需要破折号-
,那么只需将它们包含在捕获组(外括号)中。
此RegEx符合您的描述并成功提取段落(在regex101.com上测试):
matchPara = "-\n\d+\.\s*((?:.|\n)+?)\s*\n-"
它需要'全局'标志,但不需要'多线'标志。相反,行尾标记在正则表达式中匹配。重点是最里面的匹配组将匹配任何字符,包括行尾(作为替代),但是以非贪婪的方式(“+?”)这样做。它不关心字边界,因为这不是必需的。另外,“ - ”不是正则表达式中使用的特殊字符,因此不必转义。
由于额外的好处导致和尾随空格被切断(组外的“\ s *”)。