无法从字符串中移除CR LF,寻求有效解决方法
有效移除字符串中所有换行类字符的方案
你遇到的问题大概率是目标字符串中存在标准CR/LF之外的换行类Unicode字符,比如垂直制表符、换页符或者Unicode行分隔符,之前的正则没覆盖到这些情况。
推荐两种解决方案:
方案一:先清理原始数据再序列化(更可靠)
直接遍历原始的data对象,清理所有字符串字段中的换行符,再进行JSON序列化,避免序列化后转义带来的问题:
// 递归遍历并清理所有字符串中的换行类字符 function cleanLineBreaks(obj) { if (typeof obj === 'string') { // 覆盖所有Unicode定义的换行相关字符 return obj.replace(/[\r\n\v\f\x85\u2028\u2029]/g, ''); } if (Array.isArray(obj)) { return obj.map(cleanLineBreaks); } if (typeof obj === 'object' && obj !== null) { const cleaned = {}; for (const key in obj) { cleaned[key] = cleanLineBreaks(obj[key]); } return cleaned; } return obj; } // 使用示例 const cleanedData = cleanLineBreaks(data); const newdata = JSON.stringify(cleanedData);
方案二:直接清理序列化后的字符串
如果必须处理JSON.stringify后的字符串,用覆盖范围更广的正则替换:
let newdata = JSON.stringify(data); // 替换所有类型的换行字符 newdata = newdata.replace(/[\r\n\v\f\x85\u2028\u2029]/g, '');
补充说明
之前的正则/\r?\n|\r/g只覆盖了CR和LF,而Unicode标准中还有其他换行类字符:
\v:垂直制表符(U+000B)\f:换页符(U+000C)\x85:下一行(U+0085)\u2028:行分隔符(U+2028)\u2029:段落分隔符(U+2029)
这些字符都可能导致换行显示,需要一并替换。
内容的提问来源于stack exchange,提问作者spacedog
相关产品推荐
相关产品推荐

