JS正则拆分句子时U.S.等缩写的点被误判为句末分隔符如何解决?
正则调整方案
你遇到的问题核心是原有正则没有区分缩写用的点和句末点,我们可以通过负向后行断言过滤掉缩写场景的点,调整后的代码如下:
const substrings = transcript.split(/(?<![A-Z])[.!]+(?!\d)\s*|\n+\s*/);
规则说明
- 新增的
(?<![A-Z])为负向后行断言,限定只有当. / !前面不是大写英文字母时,才会被判定为句末分隔符,完美适配U.S.这类大写字母+点组成的缩写场景,不会误拆分。 - 如果需要覆盖
mr.、dr.这类小写缩写场景,可以将断言修改为(?<![a-zA-Z]),即可同时过滤大小写字母结尾的缩写点。
调整后运行你的测试文本,输出的结果就是完整的单句,不会在U.S.位置被错误拆分,也不会修改原始句子的内容,符合需求。
如果需要兼容不支持负向后行断言的旧JS环境,可以改用匹配所有句子的正向正则写法,通过match方法提取句子,示例如下:
const substrings = transcript.match(/(?:[A-Z][^.!]|[A-Z]\.[A-Z]\.)*[.!]?\s*(?=\n|$|[A-Z])/g).filter(Boolean);
内容的提问来源于stack exchange,提问作者Sheharyar Abbasi
相关产品推荐
相关产品推荐

