news 2026/10/11 8:08:52

Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找

最近在处理一批 Word 报告时,遇到了一个需求:把文档中涉及“风险”的文字标记出来,方便后续检查。

如果只是查找一个词,可以使用 Word 自带的查找功能。但实际处理时,需求可能更具体,比如只标记第一次出现的关键词、标记所有匹配位置,或者一次匹配“风险评估”“风险分析”“风险排查”等不同表述。

本文记录如何使用 Spire.Doc for Java 实现这几种文本查找和高亮操作。

一、准备环境

使用 Maven 项目时,可以在pom.xml中添加以下配置:

<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc</artifactId> <version>14.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,并保存为新的文件。这样既可以保留原始内容,也可以避免前一次高亮操作影响后续示例。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 8:08:33

Markdown语法详解:从换行、表格到AI协作的纯文本写作指南

刚开始整理资料时我也常犯一个毛病——打开一个.md文件&#xff0c;看到满屏的#、**、-&#xff0c;就像看天书一样&#xff0c;心想这玩意儿到底有什么好学的。直到后来频繁换编辑器、跨平台发内容、给AI喂Prompt&#xff0c;才慢慢明白&#xff1a;Markdown不是给程序员准备的…

作者头像 李华
网站建设 2026/10/11 8:07:11

CodeX源码解读:从入口到架构,掌握开源项目阅读方法论

作为一个常年和各种开源项目打交道的开发者&#xff0c;源码解读这件事我干了不少&#xff0c;也带过不少新人。很多人拿到一个项目&#xff0c;比如题目里的“CodeX”&#xff0c;第一反应是打开目录、点开文件、从第一个文件开始往下读&#xff0c;结果读了两天还在入口函数里…

作者头像 李华
网站建设 2026/10/11 8:03:04

Zotero + dblp:构建高效学术文献管理与参考文献工作流

说起学术文献管理&#xff0c;很多人的第一反应是“装个Zotero就够了”。但真到了写论文、做调研的阶段&#xff0c;你会发现“够用”和“好用”之间隔着一个dblp的距离。dblp是计算机领域最权威的文献索引数据库之一&#xff0c;Zotero则是目前开源生态里最活跃的文献管理工具…

作者头像 李华
网站建设 2026/10/11 8:00:32

电商后台商品添加模块设计:从数据模型到SKU生成的完整实践

1. 商品添加功能到底在解决什么问题商品添加功能是电商后台管理系统中绕不开的起点。所有电商系统的数据流&#xff0c;都是从商品数据开始的&#xff1a;用户在前台搜索、浏览、加购、下单&#xff0c;每一环都依赖后台的商品信息是否准确、完整、规范。可以这么说&#xff0c…

作者头像 李华
网站建设 2026/10/11 7:57:41

长任务跑到一半失忆:压缩策略比压缩比例更关键

版权与内容来源声明 本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容&#xff0c;均在附表 A 中标注来源&#xff1b;引用官方原文保持原样&#xff0c;不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准&#xff0c;标注「待验证」的部…

作者头像 李华