React Native不支持正则负向后行断言,求句子分割替代方案
React Native兼容的句子分割方案(忽略Mr.、Mrs.、Sr.等例外)
由于React Native不支持ES2018的负向后行断言,我们可以用以下几种替代方案实现需求:
方法1:占位符替换法
先将例外缩写中的点替换为临时占位符,避免被分割逻辑误判,分割完成后再还原。
function splitSentences(text) { // 用特殊占位符替换例外缩写里的点 const tempText = text.replace(/(Mr|Mrs|Sr)\./g, '$1'); // 按句子结束符(带空格)分割,保留分割符 const splitParts = tempText.split(/([.!?]\s)/g).filter(Boolean); // 拼接句子内容和对应的标点,同时还原占位符 return splitParts.reduce((acc, part, idx) => { if (idx % 2 === 0) { acc.push(part.replace(//g, '.').trim()); } else { acc[acc.length - 1] += part.trim(); } return acc; }, []); }
说明:选择不会在文本中出现的特殊字符(如)作为占位符,确保替换和还原过程不会干扰正常内容。分割时保留标点符号,最后将其拼回对应句子末尾。
方法2:正向匹配完整句子
直接用正则匹配包含例外缩写的完整句子,避免分割操作。
function splitSentences(text) { // 匹配包含例外缩写或普通内容的完整句子 const matches = text.match(/(?:Mr\.|Mrs\.|Sr\.|[^.!?])+[.!?]/g); // 去除每个句子前后的空白字符,处理无匹配的情况 return matches ? matches.map(sent => sent.trim()) : []; }
说明:正则中的(?:Mr\.|Mrs\.|Sr\.|[^.!?])+表示优先匹配例外缩写,再匹配非句子结束符的内容,最后以. ! ?结尾。如果文本末尾有未带标点的内容,可以调整正则为/(?:Mr\.|Mrs\.|Sr\.|[^.!?])+[.!?]?/g,再过滤空字符串。
方法3:手动遍历字符
通过遍历文本字符,跟踪当前是否处于例外缩写的语境中,手动判断句子结束位置。
function splitSentences(text) { const sentences = []; let currentSentence = ''; const exceptions = ['Mr', 'Mrs', 'Sr']; const len = text.length; let i = 0; while (i < len) { currentSentence += text[i]; // 遇到句子结束符且后面跟空格时,检查是否是例外缩写 if (['.', '!', '?'].includes(text[i]) && i < len - 1 && text[i+1] === ' ') { let isException = false; // 提取当前句子末尾的单词(去掉点) const lastSpaceIdx = currentSentence.lastIndexOf(' '); const word = lastSpaceIdx === -1 ? currentSentence.slice(0, -1) : currentSentence.slice(lastSpaceIdx + 1, -1); if (exceptions.includes(word)) { isException = true; } if (!isException) { sentences.push(currentSentence.trim()); currentSentence = ''; i++; // 跳过空格 } } i++; } // 处理最后一段无标点的文本 if (currentSentence.trim()) { sentences.push(currentSentence.trim()); } return sentences; }
说明:这种方法灵活性最高,方便后续扩展更多例外缩写(如Dr.、Jr.等),无需修改复杂正则。
内容的提问来源于stack exchange,提问作者DingleberrySmith
相关产品推荐
相关产品推荐

