资讯详情

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

📅 2026/10/11 8:09:06 | 华诺云谱 👁 阅读
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并保存为新的文件。这样既可以保留原始内容也可以避免前一次高亮操作影响后续示例。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑