如何修改正则表达式区分句末句号与缩写句号以拆分文本
问题描述
我有一个包含文本内容的.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}\\.):新增负向断言,排除两种缩写情况:\\b\\p{L}\\.:单个字母组成的单词后接句号(如立陶宛语中的K.)\\b\\p{L}{2}\\.):两个字母组成的单词后接句号(如Pr.)
按需调整
如果文本中存在3个字母的常见缩写,可扩展负向断言,添加|\\b\\p{L}{3}\\.)即可。这种模式匹配无法覆盖所有极端缩写,但在无第三方分句库的前提下是最可行的方案,建议先用样本文本测试,根据实际缩写情况调整字母长度限制。
内容的提问来源于stack exchange,提问作者AndriusSomeGuy
相关产品推荐
相关产品推荐

