You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式区分句末句号与缩写句号以拆分文本

问题描述

我有一个包含文本内容的.xlsx文件,希望编写Java代码将每个单元格内容输出到独立的.txt文件中,且每个句子在输出文件中单独占一行(原.xlsx中句子并未换行)。
原本按句号拆分字符串很简单,但文本中包含大量缩写,因此尝试用正则表达式区分句末句号和缩写句号,不过当前正则表达式失效,完全无法拆分句子。此外,因源文本语言无可用的分句识别库,无法借助第三方库实现需求。请问如何修改正则表达式,成功区分句末句号与缩写句号,并按句末句号拆分文本?

原有实现代码:

String[] sentences = combinedText.split("(?<=\\.)\\s+(?=[A-ZĄČĘĖĮŠŲŪ])");
StringBuilder cleanedText = new StringBuilder();
for (String sentence : sentences) {
    String cleanedSentence = sentence.replaceAll("[^\\p{L}\\s.ąčęėįšųūĄČĘĖĮŠŲŪ]", "").trim();
    if (!cleanedSentence.isEmpty()) {
        cleanedText.append(cleanedSentence).append("\n");
    }
}
解决方案

你的正则失效原因是未区分短单词缩写(通常是1-2个字母)和完整句子结尾的句号。可以通过负向断言过滤缩写场景,修改后的代码如下:

// 修改拆分正则,排除1-2个字母缩写后的句号
String[] sentences = combinedText.split("(?<=\\.)\\s+(?=[A-ZĄČĘĖĮŠŲŪ])(?<!\\b\\p{L}\\.|\\b\\p{L}{2}\\.)");
StringBuilder cleanedText = new StringBuilder();
for (String sentence : sentences) {
    String cleanedSentence = sentence.replaceAll("[^\\p{L}\\s.ąčęėįšųūĄČĘĖĮŠŲŪ]", "").trim();
    if (!cleanedSentence.isEmpty()) {
        cleanedText.append(cleanedSentence).append("\n");
    }
}

正则逻辑说明

  • (?<=\.)\s+(?=[A-ZĄČĘĖĮŠŲŪ]):保留原逻辑,匹配句号后接空格+大写字母的位置
  • (?<!\\b\\p{L}\\.|\\b\\p{L}{2}\\.):新增负向断言,排除两种缩写情况:
    1. \\b\\p{L}\\.:单个字母组成的单词后接句号(如立陶宛语中的K.)
    2. \\b\\p{L}{2}\\.):两个字母组成的单词后接句号(如Pr.)

按需调整

如果文本中存在3个字母的常见缩写,可扩展负向断言,添加|\\b\\p{L}{3}\\.)即可。这种模式匹配无法覆盖所有极端缩写,但在无第三方分句库的前提下是最可行的方案,建议先用样本文本测试,根据实际缩写情况调整字母长度限制。

内容的提问来源于stack exchange,提问作者AndriusSomeGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:22:39