使用VB.NET删除Word试题中选项与下一题之间的解析内容
实现方案
你之前的代码仅做了Explanation关键词的提取,要实现批量删除解析的需求,核心是锁定两个边界:上一题的最后一个选项、下一题的QUESTION NO开头标记,删除两个边界中间的所有内容即可,完整实现代码如下:
Imports Word = Microsoft.Office.Interop.Word Imports System.Text.RegularExpressions Module WordQuestionCleaner Sub Main() Try Dim objWordApp As Word.Application = Nothing Dim objDoc As Word.Document = Nothing ' 匹配试题开头的正则:QUESTION NO: 加数字 Dim questionStartRegex As New Regex("^QUESTION NO: \d+", RegexOptions.IgnoreCase) ' 匹配选项的正则:大写字母+英文点+空格开头 Dim optionRegex As New Regex("^[A-Z]\. ") ' 状态标记:是否处于需要删除的解析区间 Dim isInExplanationArea As Boolean = False objWordApp = New Word.Application() If objWordApp IsNot Nothing Then objWordApp.Visible = False ' 此处替换为你的源文件路径,建议处理前先备份原文件 objDoc = objWordApp.Documents.Open("E:\Sabbah\PMI SP Files\PMI-SP Questions.doc") End If If objDoc IsNot Nothing Then ' 倒序遍历段落,避免删除段落导致的索引错乱漏删 For i As Integer = objDoc.Paragraphs.Count To 1 Step -1 Dim p As Word.Paragraph = objDoc.Paragraphs(i) Dim paraText As String = p.Range.Text.Trim() ' 匹配到下一题开头,结束解析区间标记 If questionStartRegex.IsMatch(paraText) Then isInExplanationArea = False Continue For End If ' 匹配到选项,开启解析区间标记(后续内容直到下一题都是解析) If optionRegex.IsMatch(paraText) Then isInExplanationArea = True Continue For End If ' 处于解析区间的内容直接删除 If isInExplanationArea Then p.Range.Delete() End If Next ' 可替换为SaveAs2方法另存为新文件,避免覆盖原文件 objDoc.Save() objDoc.Close() objWordApp.Quit() MessageBox.Show("解析内容已批量删除完成") End If Catch ex As Exception MessageBox.Show("处理出错:" & ex.Message) End Try End Sub End Module
适配调整说明
- 如果你的文档选项是小写字母开头,可以把正则里的
[A-Z]改成[A-Za-z]适配 - 如果试题开头的标记格式有变化,可以自行调整
questionStartRegex的正则规则匹配实际内容
内容的提问来源于stack exchange,提问作者Mohammed Sabbah
相关产品推荐
相关产品推荐

