正则表达式优化:实现排除特定称谓的正确句子拆分
段落拆分句子的正则表达式修复
你当前的正则核心问题出在开头的字符组[^Mr|^mr|^Mrs|^mrs|^Ms|^ms]——字符组仅会匹配单个字符,它实际的含义是匹配不是M、r、|、^这些单个字符的任意字符,完全偏离了你“排除Mr/mr/Mrs/mrs/Ms/ms这些完整单词”的需求,这就导致当句子末尾字符是m/r/s时,这个字符组匹配失败,整个正则失效,拆分出错。
修正后的实现方案
要实现“排除头衔+标点”的逻辑,应该用负向后行断言((?<!...)),它能检查当前位置之前的内容是否不是指定的完整字符串,正好满足你排除特定单词的需求。
修改后的代码
text.replaceAll(/(?<!Mr|mr|Mrs|mrs|Ms|ms)(\.|\?|\!)\s[A-Z]/g, r => r.replace(/\s/, "{break}")).split("{break}");
逻辑说明
(?<!Mr|mr|Mrs|mrs|Ms|ms):确保句子结束标点(.?!)的前面不是这些头衔单词(\.|\?|\!):匹配句子结尾的标点符号\s[A-Z]:匹配标点后的空格+大写字母(新句子的开头特征)
测试验证
- 原失效示例字符串:
"A string with words. A new string."
修正后拆分结果:["A string with words.", "A new string."] - 原正常示例字符串:
"A string. A new string."
修正后拆分结果:["A string.", "A new string."] - 头衔场景(如
"Mr. Smith is here. Mrs. Jones left."):
拆分结果:["Mr. Smith is here.", "Mrs. Jones left."],不会错误拆分头衔后的标点
内容的提问来源于stack exchange,提问作者Mason Wright
相关产品推荐
相关产品推荐

