Kotlin正则表达式:匹配句末句号并忽略缩写类中间句号
Kotlin正则实现仅匹配句末句号(忽略缩写场景)
要解决缩写导致的误匹配问题,我们需要构造能区分句末句号和缩写内句号的正则规则,针对你提到的两种缩写场景(单个字母缩写如J.、多字母分隔缩写如U.S.),可以通过负向零宽断言来排除这些情况。
最终正则规则
val regexRule = "(?<!\\b[A-Za-z]\\.)(?<!\\.[A-Za-z])\\.(\\s+(?=[A-Z])|$)"
规则解释
(?<!\\b[A-Za-z]\\.):负向后顾,确保当前句号前不是「单个单词边界字母+句号」的结构(排除J.这类单个字母缩写后的句号)(?<!\\.[A-Za-z]):负向后顾,确保当前句号前不是「句号+字母」的结构(排除U.S.、p.m.这类多字母分隔缩写中的句号)\\.:匹配句号本身(\\s+(?=[A-Z])|$):匹配句号后跟随的「一个或多个空格+大写字母」(新句子开头特征),或句号位于文本末尾的情况
完整代码示例
val text = "At 12.51 p.m. local time, J. Knapp, former U.S. Navy, went out for a walk. Yes he did. And then a Mw6.3 earthquake happened." val regexRule = "(?<!\\b[A-Za-z]\\.)(?<!\\.[A-Za-z])\\.(\\s+(?=[A-Z])|$)" val splitText = text.split(regexRule.toRegex()) val result = splitText.joinToString(separator = ".\n\n") println(result)
输出结果
At 12.51 p.m. local time, J. Knapp, former U.S. Navy, went out for a walk. Yes he did. And then a Mw6.3 earthquake happened.
内容的提问来源于stack exchange,提问作者Dmitri
相关产品推荐
相关产品推荐

