如何仅按单个句点分割文本,避免匹配三连省略号?
问题与解决方案
问题背景
现有文本:
const text = "If you look at a map of Europe... you will... notice. That apart from the big... landmass known as the continent, there are two small islands to the west."
需要按单个句点分割文本(保留句点在句中),但要排除三连省略号的干扰,期望得到如下数组:
const result = [ "If you look at a map of Europe... you will... notice.", "That apart from the big... landmass known as the continent, there are two small islands to the west." ]
现有函数可处理无省略号的情况,但遇到三连省略号时会错误分割每个句点:
function splitByPunctuationMark(str) { return str.split(/(?<=[!.?])/).map(value => value.trim()) }
函数运行结果
1. 无三连省略号时(正常工作):
const result = splitByPunctuationMark("If you look at a map of Europe you will notice. That apart from the big landmass known as the continent, there are two small islands to the west.") console.log(result) /* [ "If you look at a map of Europe you will notice.", "That apart from the big landmass known as the continent, there are two small islands to the west." ] */
2. 有三连省略号时(分割错误):
const result = splitByPunctuationMark("If you look at a map of Europe... you will... notice. That apart from the big... landmass known as the continent, there are two small islands to the west.") console.log(result) /* [ "If you look at a map of Europe.", ".", ".", "you will.", ".", ".", "notice.", "That apart from the big.", ".", ".", "landmass known as the continent, there are two small islands to the west." ] */
解决方案
原正则会匹配所有!.?,包括省略号里的句点,导致错误分割。我们需要调整正则,只匹配作为句子结尾标记的标点——即后面跟空格/字符串结尾,且前面不属于三连省略号的!.?。
修正后的函数:
function splitByPunctuationMark(str) { return str.split(/(?<=[!.?])(?=\s|$)(?<!\.\.)/).map(value => value.trim()); }
正则解释
(?<=[!.?]):正向后顾断言,确保当前位置前是句点、问号或感叹号(?=\s|$):正向前瞻断言,确保当前位置后是空格或字符串结尾(符合句子结束的逻辑)(?<!\.\.):负向后顾断言,确保当前位置前没有连续两个句点(排除三连省略号的最后一个句点)
测试验证
const text = "If you look at a map of Europe... you will... notice. That apart from the big... landmass known as the continent, there are two small islands to the west."; console.log(splitByPunctuationMark(text)); /* [ "If you look at a map of Europe... you will... notice.", "That apart from the big... landmass known as the continent, there are two small islands to the west." ] */
内容的提问来源于stack exchange,提问作者Mykyta Manuilenko
相关产品推荐
相关产品推荐

