Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
最近在处理一批 Word 报告时遇到了一个需求把文档中涉及“风险”的文字标记出来方便后续检查。如果只是查找一个词可以使用 Word 自带的查找功能。但实际处理时需求可能更具体比如只标记第一次出现的关键词、标记所有匹配位置或者一次匹配“风险评估”“风险分析”“风险排查”等不同表述。本文记录如何使用 Spire.Doc for Java 实现这几种文本查找和高亮操作。一、准备环境使用 Maven 项目时可以在pom.xml中添加以下配置repositories repository idcom.e-iceblue/id namee-iceblue/name urlhttps://repo.e-iceblue.cn/repository/maven-public//url /repository /repositories dependencies dependency groupIde-iceblue/groupId artifactIdspire.doc/artifactId version14.9.5/version /dependency /dependencies这里使用14.9.5版本作为示例并非要求必须使用最新版本。准备一个名为input.docx的 Word 文档内容如下项目风险需要提前识别。本周完成风险评估下周开始风险排查。风险分析结果需要记录。其他部门的风险评估也要跟进。下面分别处理首次匹配、全部匹配和正则表达式匹配。二、只高亮第一次出现的关键词如果只需要标记文档中第一次出现的“风险”可以使用Document.findString()方法。import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.documents.TextSelection; import java.awt.Color; public class HighlightFirstOccurrence { public static void main(String[] args) { // 加载 Word 文档 Document document new Document(); try { document.loadFromFile(input.docx); // 查找第一次出现的关键词 TextSelection selection document.findString(风险, false, false); // 设置匹配文本的高亮颜色 if (selection ! null) { selection.getAsOneRange() .getCharacterFormat() .setHighlightColor(Color.YELLOW); } // 保存 Word 文档 document.saveToFile( HighlightFirst.docx, FileFormat.Docx_2013); } finally { document.dispose(); } } }findString()的两个布尔参数分别表示是否区分大小写以及是否只匹配完整单词。该方法返回一个TextSelection对象因此只会对找到的第一个匹配结果设置高亮。对于示例文档第一句中的“风险”会被标记为黄色后面出现的相同文字则保持不变。另外代码检查了匹配结果是否为null避免关键词不存在时出现空指针异常。三、高亮所有匹配的关键词如果需要标记整个文档中的所有“风险”可以将findString()换成findAllString()。import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.documents.TextSelection; import java.awt.Color; public class HighlightAllOccurrences { public static void main(String[] args) { // 加载 Word 文档 Document document new Document(); try { document.loadFromFile(input.docx); // 查找所有匹配的关键词 TextSelection[] selections document.findAllString(风险, false, false); // 遍历匹配结果并设置高亮 if (selections ! null) { for (TextSelection selection : selections) { selection.getAsOneRange() .getCharacterFormat() .setHighlightColor(Color.YELLOW); } } // 保存 Word 文档 document.saveToFile( HighlightAll.docx, FileFormat.Docx_2013); } finally { document.dispose(); } } }两者最大的区别在于返回值findString()返回一个TextSelection用于处理首次匹配。findAllString()返回一个TextSelection[]用于处理全部匹配。示例文档中的“风险”共出现 5 次因此使用findAllString()时这 5 处文字都会被高亮。这里通过getAsOneRange()获取匹配的文本范围再使用getCharacterFormat().setHighlightColor()设置黄色高亮。这种操作修改的是匹配文字的高亮格式而不是将所在段落整体设置为黄色。四、使用正则表达式进行灵活匹配前面两种方法都适合搜索固定字符串。不过当需要查找的文字存在一定变化时正则表达式会更方便。例如我们希望同时高亮以下三种表述风险评估风险分析风险排查并且允许“风险”和后面的词之间存在空格。可以使用下面的正则表达式Pattern pattern Pattern.compile( 风险\\s*(评估|分析|排查));其中风险表示固定匹配这两个汉字。\\s*表示允许出现零个或多个空白字符。在 Java 字符串中反斜杠需要转义。(评估|分析|排查)表示匹配三个选项中的任意一个。1. 高亮第一个正则匹配结果如果只需要处理第一个符合模式的文本可以使用findPattern()import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.documents.TextSelection; import java.awt.Color; import java.util.regex.Pattern; public class HighlightFirstPattern { public static void main(String[] args) { // 加载 Word 文档 Document document new Document(); try { document.loadFromFile(input.docx); // 定义正则表达式 Pattern pattern Pattern.compile( 风险\\s*(评估|分析|排查)); // 查找第一个符合正则表达式的文本 TextSelection selection document.findPattern(pattern); // 设置匹配文本的高亮颜色 if (selection ! null) { selection.getAsOneRange() .getCharacterFormat() .setHighlightColor(Color.YELLOW); } // 保存 Word 文档 document.saveToFile( HighlightFirstPattern.docx, FileFormat.Docx_2013); } finally { document.dispose(); } } }对于示例文档首先匹配到的是“风险评估”。2. 高亮所有正则匹配结果若要处理所有符合条件的文本则使用findAllPattern()import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.documents.TextSelection; import java.awt.Color; import java.util.regex.Pattern; public class HighlightAllPatterns { public static void main(String[] args) { // 加载 Word 文档 Document document new Document(); try { document.loadFromFile(input.docx); // 定义正则表达式 Pattern pattern Pattern.compile( 风险\\s*(评估|分析|排查)); // 查找所有符合正则表达式的文本 TextSelection[] selections document.findAllPattern(pattern); // 遍历匹配结果并设置高亮 if (selections ! null) { for (TextSelection selection : selections) { selection.getAsOneRange() .getCharacterFormat() .setHighlightColor(Color.YELLOW); } } // 保存 Word 文档 document.saveToFile( HighlightAllPatterns.docx, FileFormat.Docx_2013); } finally { document.dispose(); } } }该方法接收java.util.regex.Pattern对象并返回匹配结果数组。对于准备的示例内容预计会匹配到两处“风险评估”、一处“风险排查”和一处“风险分析”共 4 处。值得注意的是正则表达式实现的是基于规则的灵活匹配并不等同于语义模糊搜索。例如该表达式不会自动识别“潜在隐患”和“风险”之间的语义关联。五、实际使用中需要注意的问题1. 正则表达式不一定能跨越复杂的 Word 结构Word 文档中的内容可能被拆分成多个文本对象尤其是包含不同字体、域、文本框或修订内容时。因此对于普通段落中的文本可以按照上述方式查找但如果正则表达式需要跨段落或跨复杂文档对象匹配应另外进行测试不能简单假设所有连续可见的文字都能作为一个整体匹配。2. 多个关键词可以用正则表达式合并查找例如要同时标记“风险”“延期”和“违约”可以使用Pattern pattern Pattern.compile( 风险|延期|违约);再通过findAllPattern()获取所有匹配项。这通常比针对每个关键词单独编写一段查找代码更简洁。3. 高亮颜色可以修改除了黄色也可以使用其他颜色例如selection.getAsOneRange() .getCharacterFormat() .setHighlightColor(Color.GREEN);需要说明的是setHighlightColor()设置的是 Word 文本高亮颜色并不是字体颜色。4. 输出文件应与源文件分开示例中每次都重新加载input.docx并保存为新的文件。这样既可以保留原始内容也可以避免前一次高亮操作影响后续示例。

相关新闻

基于Spring Boot的交通安全知识学习平台毕设实战解析

基于Spring Boot的交通安全知识学习平台毕设实战解析

做毕设这几年,被问得最多的一类题并不是那些听起来高大上的“大数据平台”“人工智能系统”,反而是这种看起来平平无奇、但做起来五脏俱全的项目——“基于Spring Boot的交通安全知识学习平台”。这种题目的典型特点是:需求明确、场景贴近生活…

2026/10/11 8:09:12 阅读更多 →
基于二进制粒子群优化的PMU最优配置方法及Matlab实现

基于二进制粒子群优化的PMU最优配置方法及Matlab实现

做电力系统规划或调度运行的朋友,对PMU这个名字应该都不陌生。PMU全称是同步相量测量单元,能以微秒级精度同步采集全网电压、电流相量,是广域测量系统(WAMS)的基础设备。但一台PMU从设备采购、测点改造到通信接入&…

2026/10/11 8:09:12 阅读更多 →
QRLSTM:Matlab实现分位数回归的LSTM区间预测

QRLSTM:Matlab实现分位数回归的LSTM区间预测

搞数据回归预测的朋友应该都有过一个很实际的困惑:LSTM用着顺手,预测曲线看着也漂亮,但模型只给你一条单点预测线。真要拿去做决策,比如判断“明天负荷会不会越限”“设备还能稳定跑多久”“风电功率波动范围有多大”,…

2026/10/11 8:09:12 阅读更多 →

最新新闻

深度学习OCR系统实战:基于PyTorch的CRNN+CTC文字识别

深度学习OCR系统实战:基于PyTorch的CRNN+CTC文字识别

简介:基于深度学习的文字识别系统完整项目包,面向毕业设计、课程设计与期末大作业场景,适合需要快速搭建OCR系统的计算机相关专业学生。项目采用CNN与RNN结合实现文字检测与识别,覆盖图像预处理、模型训练、后端接口与移动端展示全…

2026/10/11 10:25:10 阅读更多 →
使用 claude-howto 的 blog-draft 技能与草稿模板,系统化产出高质量技术博客

使用 claude-howto 的 blog-draft 技能与草稿模板,系统化产出高质量技术博客

教程文档 【免费下载链接】claude-howto A visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value. 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-howto 点…

2026/10/11 10:25:10 阅读更多 →
Excel自动评分:用LOOKUP和IF函数实现体育成绩折算自动化

Excel自动评分:用LOOKUP和IF函数实现体育成绩折算自动化

简介:这份资源是一份面向体育教师及学校教务人员的Excel实用教程文档,聚焦体育测试成绩换算这一高频痛点,帮助读者用公式与函数替代人工比对,降低错漏率。文档围绕学生成绩空表搭建、跳远与跳绳评分标准表制作、LOOKUP近似匹配与I…

2026/10/11 10:25:10 阅读更多 →
Legendary OSINT 海事篇:AIS 船舶追踪工具全景对比

Legendary OSINT 海事篇:AIS 船舶追踪工具全景对比

Legendary OSINT 海事篇:AIS 船舶追踪工具全景对比 【免费下载链接】Legendary_OSINT A list of OSINT tools & resources for (fraud-)investigators, CTI-analysts, KYC, AML and more. 项目地址: https://gitcode.com/GitHub_Trending/le/Legendary_OSINT…

2026/10/11 10:25:10 阅读更多 →
ProxCenter热迁移深度解析:VDDK+nbdkit实现虚拟机零停机迁移的原理与调优

ProxCenter热迁移深度解析:VDDK+nbdkit实现虚拟机零停机迁移的原理与调优

【免费下载链接】proxcenter-ui ProxCenter is an alternative to VMware vCenter for Proxmox environments. It provides a modern, intuitive web interface to manage multiple Proxmox VE clusters and Proxmox Backup Server instances from a single pane of glass. 项目…

2026/10/11 10:25:10 阅读更多 →
2025年AI IDE实战测评榜:从个人开发到企业部署的完整选型攻略(TaoToken统一API接入篇)

2025年AI IDE实战测评榜:从个人开发到企业部署的完整选型攻略(TaoToken统一API接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:24:10 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →